Skip to content

Commit e0d1233

Browse files
authored
Merge pull request #22481 from chrisdennis/issue-22480
Modify memory option rounding to avoid overflow
2 parents 19cb44f + 100ec49 commit e0d1233

File tree

3 files changed

+84
-11
lines changed

3 files changed

+84
-11
lines changed

runtime/util/vmargs.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -575,9 +575,17 @@ optionValueOperations(J9PortLibrary *portLibrary, J9VMInitArgs* j9vm_args, IDATA
575575
} else {
576576
switch (*cursor) {
577577
case '\0':
578-
oldValue = value;
579-
value = (value + sizeof(UDATA) - 1) & ~(sizeof(UDATA) - 1); /* round to nearest pointer value */
580-
if (value < oldValue) return OPTION_OVERFLOW;
578+
#if defined(J9VM_ENV_DATA64)
579+
#define MEM_MAX_LIMIT I_64_MAX
580+
#else /* defined(J9VM_ENV_DATA64) */
581+
#define MEM_MAX_LIMIT U_32_MAX
582+
#endif /* defined(J9VM_ENV_DATA64) */
583+
/* Round (up if possible) to a multiple of the pointer width. */
584+
if (value < ((UDATA)MEM_MAX_LIMIT & ~(sizeof(UDATA) - 1))) {
585+
value += sizeof(UDATA) - 1;
586+
}
587+
value &= ~(sizeof(UDATA) - 1);
588+
#undef MEM_MAX_LIMIT
581589
break;
582590
case 'k':
583591
case 'K':

runtime/vm/jvminit.c

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2550,6 +2550,15 @@ VMInitStages(J9JavaVM *vm, IDATA stage, void* reserved)
25502550
parseErrorOption = VMOPT_XXMAXDIRECTMEMORYSIZEEQUALS;
25512551
goto _memParseError;
25522552
}
2553+
#if defined(J9VM_ENV_DATA64)
2554+
if ((~(UDATA)0 != vm->directByteBufferMemoryMax)
2555+
&& (vm->directByteBufferMemoryMax > (((UDATA)I_64_MAX) & ~(sizeof(UDATA) - 1)))
2556+
) {
2557+
parseErrorOption = VMOPT_XXMAXDIRECTMEMORYSIZEEQUALS;
2558+
parseError = OPTION_OUTOFRANGE;
2559+
goto _memParseError;
2560+
}
2561+
#endif /* defined(J9VM_ENV_DATA64) */
25532562

25542563
/* workaround option in case if OMRPORT_VMEM_ALLOC_QUICK Smart Address feature still be not reliable */
25552564
argIndex = FIND_AND_CONSUME_VMARG(EXACT_MATCH, VMOPT_XXNOFORCE_FULL_HEAP_ADDRESS_RANGE_SEARCH, NULL);
@@ -5382,7 +5391,7 @@ testFindArgs(J9JavaVM* vm)
53825391
#define FAIL (failed = "Failed ")
53835392
#define PASS ("Passed ")
53845393
#define SET_TO(element, string) vm->vmArgsArray->actualVMArgs->options[element].optionString = string; printf("\nTesting: %s \t\t", string)
5385-
#define TEST_INT(value, expected) printf( (value==expected) ? PASS : FAIL )
5394+
#define TEST_INT(value, expected) printf("%s", (value==expected) ? PASS : FAIL )
53865395

53875396
#ifdef J9VM_OPT_SIDECAR
53885397
#define SET_MAP_TO(element, j9opt, sovopt, mapflags) registerCmdLineMapping(vm, sovopt, j9opt, mapflags)
@@ -5810,13 +5819,13 @@ testOptionValueOps(J9JavaVM* vm)
58105819

58115820
#define FAIL (failed = "Failed ")
58125821
#define PASS ("Passed ")
5813-
#define COMPARE(result, expected) printf((result==NULL) ? FAIL : ((strcmp(result, expected)==0) ? PASS : FAIL ))
5814-
#define IS_NULL(result) printf((result==NULL) ? PASS : FAIL)
5815-
#define IS_EMPTY_STRING(result) printf((result!=NULL && strlen(result)==0) ? PASS : FAIL)
5816-
#define IS_0(result) printf((result=='\0') ? PASS : FAIL)
5822+
#define COMPARE(result, expected) printf("%s", (result==NULL) ? FAIL : ((strcmp(result, expected)==0) ? PASS : FAIL ))
5823+
#define IS_NULL(result) printf("%s", (result==NULL) ? PASS : FAIL)
5824+
#define IS_EMPTY_STRING(result) printf("%s", (result!=NULL && strlen(result)==0) ? PASS : FAIL)
5825+
#define IS_0(result) printf("%s", (result=='\0') ? PASS : FAIL)
58175826
#define SET_TO(element, string) vm->vmArgsArray->actualVMArgs->options[element].optionString = string; printf("\nTesting: %s \t\t", string)
58185827
#define NEXT_ELEMENT(array) (array += strlen(array) + 1)
5819-
#define TEST_INT(value, expected) printf( (value==expected) ? PASS : FAIL )
5828+
#define TEST_INT(value, expected) printf("%s", (value==expected) ? PASS : FAIL )
58205829

58215830
#ifdef J9VM_OPT_SIDECAR
58225831
#define SET_MAP_TO(element, j9opt, sovopt, mapflags) registerCmdLineMapping(vm, sovopt, j9opt, mapflags)
@@ -6372,8 +6381,13 @@ testOptionValueOps(J9JavaVM* vm)
63726381
SET_TO(1, "-Xfok5347534875438758474");
63736382
optName = "-Xfok";
63746383
intResult = GET_INTEGER_VALUE(1, optName, uResult);
6384+
#if defined(J9VM_ENV_DATA64)
6385+
TEST_INT(uResult, 5347534875438758474);
6386+
TEST_INT(intResult, OPTION_OK);
6387+
#else /* defined(J9VM_ENV_DATA64) */
63756388
TEST_INT(uResult, 0);
63766389
TEST_INT(intResult, OPTION_MALFORMED);
6390+
#endif /* defined(J9VM_ENV_DATA64) */
63776391

63786392
SET_TO(1, "-Xfoo31");
63796393
optName = "-Xfoo";
@@ -6390,8 +6404,35 @@ testOptionValueOps(J9JavaVM* vm)
63906404
SET_TO(1, "-Xfob4294967295"); /* (2^32 - 1) */
63916405
optName = "-Xfob";
63926406
intResult = GET_MEMORY_VALUE(1, optName, uResult);
6407+
#if defined(J9VM_ENV_DATA64)
6408+
TEST_INT(uResult, 4294967296);
6409+
TEST_INT(intResult, OPTION_OK);
6410+
#else /* defined(J9VM_ENV_DATA64) */
6411+
TEST_INT(uResult, 4294967292);
6412+
TEST_INT(intResult, OPTION_OK);
6413+
#endif /* defined(J9VM_ENV_DATA64) */
6414+
6415+
SET_TO(1, "-Xfob9223372036854775807"); /* (2^63 - 1) */
6416+
optName = "-Xfob";
6417+
intResult = GET_MEMORY_VALUE(1, optName, uResult);
6418+
#if defined(J9VM_ENV_DATA64)
6419+
TEST_INT(uResult, 9223372036854775800);
6420+
TEST_INT(intResult, OPTION_OK);
6421+
#else /* defined(J9VM_ENV_DATA64) */
6422+
TEST_INT(uResult, 0);
6423+
TEST_INT(intResult, OPTION_MALFORMED);
6424+
#endif /* defined(J9VM_ENV_DATA64) */
6425+
6426+
SET_TO(1, "-Xfob9223372036854775809"); /* (2^63 + 1) */
6427+
optName = "-Xfob";
6428+
intResult = GET_MEMORY_VALUE(1, optName, uResult);
6429+
#if defined(J9VM_ENV_DATA64)
6430+
TEST_INT(uResult, 9223372036854775808U);
6431+
TEST_INT(intResult, OPTION_OK);
6432+
#else /* defined(J9VM_ENV_DATA64) */
63936433
TEST_INT(uResult, 0);
6394-
TEST_INT(intResult, OPTION_OVERFLOW);
6434+
TEST_INT(intResult, OPTION_MALFORMED);
6435+
#endif /* defined(J9VM_ENV_DATA64) */
63956436

63966437
SET_TO(1, "-Xfoc4294967280"); /* 0xfffffff0 */
63976438
optName = "-Xfoc";
@@ -6572,14 +6613,24 @@ testOptionValueOps(J9JavaVM* vm)
65726613
SET_TO(1, "-Xfou99999999999M");
65736614
optName = "-Xfou";
65746615
intResult = GET_MEMORY_VALUE(1, optName, uResult);
6616+
#if defined(J9VM_ENV_DATA64)
6617+
TEST_INT(uResult, 104857599998951424);
6618+
TEST_INT(intResult, OPTION_OK);
6619+
#else /* defined(J9VM_ENV_DATA64) */
65756620
TEST_INT(uResult, 0);
65766621
TEST_INT(intResult, OPTION_MALFORMED);
6622+
#endif /* defined(J9VM_ENV_DATA64) */
65776623

65786624
SET_TO(1, "-Xfow99999M");
65796625
optName = "-Xfow";
65806626
intResult = GET_MEMORY_VALUE(1, optName, uResult);
6627+
#if defined(J9VM_ENV_DATA64)
6628+
TEST_INT(uResult, 104856551424);
6629+
TEST_INT(intResult, OPTION_OK);
6630+
#else /* defined(J9VM_ENV_DATA64) */
65816631
TEST_INT(uResult, 0);
65826632
TEST_INT(intResult, OPTION_OVERFLOW);
6633+
#endif /* defined(J9VM_ENV_DATA64) */
65836634

65846635
#ifdef J9VM_OPT_SIDECAR
65856636

@@ -6607,7 +6658,7 @@ testOptionValueOps(J9JavaVM* vm)
66076658
vm->vmArgsArray->actualVMArgs->options[5].optionString = origOption5;
66086659
vm->vmArgsArray->actualVMArgs->options[6].optionString = origOption6;
66096660

6610-
printf((failed==NULL) ? "\n\nTESTS PASSED\n" : "\n\nTESTS FAILED\n");
6661+
printf("%s", (failed==NULL) ? "\n\nTESTS PASSED\n" : "\n\nTESTS FAILED\n");
66116662
}
66126663

66136664

test/functional/cmdLineTests/xxargtest/XXArgumentTesting_j9.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,18 @@
127127
<output type="failure" caseSensitive="yes" regex="no">Compressed References</output>
128128
<output type="failure" caseSensitive="no" regex="no">Unhandled Exception</output>
129129
</test>
130+
131+
<test id="Verify 64-bit platforms reject MaxDirectMemorySize greater than Long.MAX_VALUE">
132+
<command>$EXE$ -XX:MaxDirectMemorySize=9223372036854775808 -version</command>
133+
<platformRequirements>bits.64</platformRequirements>
134+
<return type="failure" value="0"/>
135+
<output type="success" caseSensitive="no" javaUtilPattern="no" regex="no">Parse error for -XX:MaxDirectMemorySize= - value out of range.</output>
136+
</test>
137+
138+
<test id="Verify 64-bit platforms allow MaxDirectMemorySize equal to Long.MAX_VALUE">
139+
<command>$EXE$ -XX:MaxDirectMemorySize=9223372036854775807 -XX:+PrintFlagsFinal -version</command>
140+
<platformRequirements>bits.64</platformRequirements>
141+
<return type="success" value="0"/>
142+
<output type="required" caseSensitive="no" javaUtilPattern="yes" regex="yes">MaxDirectMemorySize\s*=\s*9223372036854775800</output>
143+
</test>
130144
</suite>

0 commit comments

Comments
 (0)