RFR: 8230466: check malloc/calloc results in jdk.hotspot.agent

Baesken, Matthias matthias.baesken at sap.com
Thu Sep 5 08:19:05 UTC 2019


Hello  Serguei,   thanks  for the comments .

> 
> http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.1/src/jdk.hotspot.
> agent/linux/native/libsaproc/symtab.c.frames.html
> 
>   279 build_id_to_debug_filename (size_t size, unsigned char *data)
>   280 {
>   . . .
>   283   filename = malloc(strlen (debug_file_directory) + (sizeof
> "/.build-id/" - 1) + 1
>   284                     + 2 * size + (sizeof ".debug" - 1) + 1);
>   285   if (filename == NULL) {
>   286     return NULL;
>   287   }
>   . . .
>   312   char *filename
>   313     = (build_id_to_debug_filename (note->n_descsz, bytes));
>   314   if (filename == NULL) {
>   315     return NULL;
>   316   }
> 
> There is no need to check filename for NULL at the line 314 as the function
> build_id_to_debug_filename with new check at the line 285 never returns
> NULL.
> 

At   line  286  of   build_id_to_debug_filename    we now  return NULL  (in case malloc cannot alloc memory).  So we should check this also
  at   line 314 , or do I miss something ?


> 
> http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.1/src/jdk.hotspot.
> agent/macosx/native/libsaproc/MacosxDebuggerLocal.m.frames.html
> 
>   354   array = (*env)->NewByteArray(env, numBytes);
>   . . .
>   376   if (pages == NULL) {
>   377     return NULL;
>   378   }
>   379   mapped = calloc(pageCount, sizeof(int));
>   380   if (mapped == NULL) {
>   381     free(pages);
>   382     return NULL;
>   383   }
> 
> Just a question:
>    We do not release the array allocated at line 354 because this local
> reference
>    will be auto-released when returning to Java. Is this correct?
> 

Good point, I think  we better  add   DeleteLocalRef   here in case of the new  early returns .


> 
> http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.1/src/jdk.hotspot.
> agent/macosx/native/libsaproc/symtab.c.frames.html
> 
>    69     if (is_debug()) {
>    70       DBT rkey, rvalue;  71       char* tmp = (char
> *)malloc(strlen(symtab->symbols[i].name) + 1);
>    72       if (tmp != NULL) {
>    73         strcpy(tmp, symtab->symbols[i].name);
>    74         rkey.data = tmp;
>    75         rkey.size = strlen(tmp) + 1;
>    76 (*symtab->hash_table->get)(symtab->hash_table, &rkey, &rvalue, 0);
>    77         // we may get a copy back so compare contents
>    78         symtab_symbol *res = (symtab_symbol *)rvalue.data;
>    79         if (strcmp(res->name, symtab->symbols[i].name) ||
>    80           res->offset != symtab->symbols[i].offset ||
>    81           res->size != symtab->symbols[i].size) {
>    82             print_debug("error to get hash_table value!\n");
>    83         }
>    84         free(tmp);
>    85       }
> 
> If malloc returns NULL then this debugging part will be we silently skipped.
> In other such cases there is an attempt to print a debug message.
> For instance:
> 
>   140   symtab = (symtab_t *)malloc(sizeof(symtab_t));
>   141   if (symtab == NULL) {
>   142     print_debug("out of memory: allocating symtab\n");
>   143     return NULL;
>   144   }
> 
> I understand that print_debug can fail with out of memory as well.
> But it depends on its implementation.
> 
> Thanks,
> Serguei
> 
> 

That's a good idea . I added a message .

See  new  webrev :    http://cr.openjdk.java.net/~mbaesken/webrevs/8230466.2/


Thanks, Matthias



More information about the serviceability-dev mailing list