BUG #19016: Re: BUG #18908: DEREF_OF_NULL: After having been assigned to a NULL value at descriptor.c:203
От | PG Bug reporting form |
---|---|
Тема | BUG #19016: Re: BUG #18908: DEREF_OF_NULL: After having been assigned to a NULL value at descriptor.c:203 |
Дата | |
Msg-id | 19016-0711e547eb0c3a20@postgresql.org обсуждение исходный текст |
Список | pgsql-bugs |
The following bug has been logged on the website: Bug reference: 19016 Logged by: Eugeny Goryachev Email address: gorcom2012@gmail.com PostgreSQL version: 17.4 Operating system: Ubuntu Description: Hello, This is regarding bug report BUG #18908. I have reviewed this block of code and concluded that it does not require any fixes. This is a false positive from the static analyzer. In the output_get_descr() function, there is a call: ``` ECPGdump_a_type(base_yyout, v->name, v->type, v->brace_level, NULL, NULL, -1, NULL, NULL, str_zero, NULL, NULL); ``` where the 5th parameter is passed as NULL. Then, in the ECPGdump_a_type() function, this 5th parameter is defined as ind_name and is passed as the 3rd parameter to: ``` ECPGdump_a_struct(o, name, ind_name, str_one, type, ind_type, prefix, ind_prefix); ``` In ECPGdump_a_struct(), there is a dereference of the ind_name pointer: ``` char *ind_pbuf = (char *) mm_alloc(strlen(ind_name) + ((ind_prefix == NULL) ? 0 : strlen(ind_prefix)) + 3); ``` Here, if ind_name == NULL, calling strlen(ind_name) would cause a process crash (segmentation fault). To demonstrate that this can never happen and that the analyzer is mistaken, let’s look at the condition under which ECPGdump_a_struct() is called from ECPGdump_a_type(): ``` switch (type->type) { case ECPGt_struct: ``` That is, only if the processed variable is of type struct. However, output_get_descr() never processes structs — it only works with descriptors. The field type->type (which is v->type) comes from: ``` const struct variable *v = find_variable(results->variable); ``` But in output_get_descr(), we process descriptor fields (SQLDA), and results->value is one of the descriptor’s fields. All these fields are primitive types, not structs: ``` /* descriptor items */ enum ECPGdtype { ECPGd_count = 1, ECPGd_data, ECPGd_di_code, ECPGd_di_precision, ECPGd_indicator, ECPGd_key_member, ECPGd_length, ECPGd_name, ECPGd_nullable, ECPGd_octet, ECPGd_precision, ECPGd_ret_length, ECPGd_ret_octet, ECPGd_scale, ECPGd_type, ECPGd_EODT, /* End of descriptor types. */ ECPGd_cardinality }; ``` Therefore, ECPGdump_a_struct() will never be called from output_get_descr() because: v->type->type will never be ECPGt_struct in this context; results->value refers to descriptor fields, not C structs. Consequently, a call to strlen(ind_name) with ind_name == NULL is unreachable. Best regards, Eugeny Goryachev
В списке pgsql-bugs по дате отправления: