Hi, we run coverity & clang scans time to time. I filtered all the false positives and the following are results which seemed suspicious to me. It's mostly for unlikely code paths which could be triggered by error state or invalid input. I am not familiar with the code internals, so maybe it's unlikely or impossible such conditions would ever trigger, but I am providing the results for investigation. The scan was run over 3.5.8, but I verified it's also valid for 3.5.9.
11. postfix-3.5.8/src/util/dict_inline.c:116: alloc_fn: Storage is returned from allocation function "extpar". 12. postfix-3.5.8/src/util/dict_inline.c:116: var_assign: Assigning: "free_me" = storage returned from "extpar(&nameval, "{}", 1)". 13. postfix-3.5.8/src/util/dict_inline.c:116: var_assign: Assigning: "err" = "free_me". 17. postfix-3.5.8/src/util/dict_inline.c:125: overwrite_var: Overwriting "err" in "err = free_me = dict_file_get_error(dict)" leaks the storage that "err" points to. # 123| # 124| if ((base64_buf = dict_file_to_b64(dict, value)) == 0) { # 125|-> err = free_me = dict_file_get_error(dict); # 126| break; # 127| } I think it could miss at least one free() for respective free_me. 14. postfix-3.5.8/src/util/dict_inline.c:124: uninit_use_in_call: Using uninitialized value "value" when calling "dict_file_to_b64". # 122| VSTRING *base64_buf; # 123| # 124|-> if ((base64_buf = dict_file_to_b64(dict, value)) == 0) { # 125| err = free_me = dict_file_get_error(dict); # 126| break; I think it could call dict_file_to_b64 with uninitialized value. 5. Defect type: NULL_RETURNS 6. postfix-3.5.8/src/global/haproxy_srvr.c:456: returned_null: "mystrtok" returns "NULL" (checked 62 out of 76 times). 7. postfix-3.5.8/src/global/haproxy_srvr.c:456: dereference: Dereferencing a pointer that might be "NULL" "mystrtok(&cp, " \r")" when calling "haproxy_srvr_parse_proto". 8. postfix-3.5.8/src/global/dict_ldap.c:1692: example_checked: Example 1: "mystrtok(&s, ", \t\r\n")" has its value checked in "(h = mystrtok(&s, ", \t\r\n")) != NULL". 9. postfix-3.5.8/src/global/mail_conf.c:158: example_checked: Example 2: "mystrtok(&value, ", \t\r\n")" has its value checked in "(cp = mystrtok(&value, ", \t\r\n")) != NULL". 10. postfix-3.5.8/src/global/mail_version.c:147: example_checked: Example 3: "mystrtok(&cp, "")" has its value checked in "(mp->snapshot = mystrtok(&cp, "")) == NULL". 11. postfix-3.5.8/src/global/map_search.c:211: example_checked: Example 4: "mystrtok(&attr_value, ", \t\r\n")" has its value checked in "(atom = mystrtok(&attr_value, ", \t\r\n")) != NULL". 12. postfix-3.5.8/src/global/match_service.c:107: example_checked: Example 5: "mystrtok(&bp, delim)" has its value checked in "(item = mystrtok(&bp, delim)) != NULL". # 454| else if (haproxy_srvr_parse_lit(NEXT_TOKEN, "PROXY", (char *) 0) < 0) # 455| err = "unexpected protocol header"; # 456|-> else if (haproxy_srvr_parse_proto(NEXT_TOKEN, &addr_family) < 0) # 457| err = "unsupported protocol type"; # 458| else if (haproxy_srvr_parse_addr(NEXT_TOKEN, smtp_client_addr, I think for malformed input it could fail by calling strncasecmp with NULL. 1. postfix-3.5.8/src/tlsproxy/tlsproxy.c:1881:49: warning[-Wmissing-braces]: missing braces around initializer # static const CONFIG_STR_TABLE str_table[] = { # ^ # 1879| 0, # 1880| }; # 1881|-> static const CONFIG_STR_TABLE str_table[] = { # 1882| VAR_TLSP_TLS_CHAIN_FILES, DEF_TLSP_TLS_CHAIN_FILES, &var_tlsp_tls_chain_files, 0, 0, # 1883| VAR_TLSP_TLS_CERT_FILE, DEF_TLSP_TLS_CERT_FILE, &var_tlsp_tls_cert_file, 0, 0, I think it should have braces around table lines. There are multiple tables with the same warning. 2. postfix-3.5.8/src/smtp/smtp_session.c:200: var_compare_op: Comparing "session->stream" to null implies that "session->stream" might be null. 5. postfix-3.5.8/src/smtp/smtp_session.c:208: var_deref_model: Passing null pointer "session->stream" to "tls_session_stop", which dereferences it. # 206| tls_proxy_context_free(session->tls_context); # 207| else # 208|-> tls_client_stop(smtp_tls_ctx, session->stream, # 209| var_smtp_starttls_tmout, 0, session->tls_context); # 210| } It's suspicious that there is the NULL check, but later it could fail on NULL dereference. 7. postfix-3.5.8/src/smtpd/smtpd.c:1712: var_compare_op: Comparing "state->milters" to null implies that "state->milters" might be null. 9. postfix-3.5.8/src/smtpd/smtpd.c:1727: var_deref_model: Passing "state" to "mail_reset", which dereferences null "state->milters". # 1725| helo_reset(state); # 1726| chat_reset(state, var_smtpd_hist_thrsh); # 1727|-> mail_reset(state); # 1728| rcpt_reset(state); # 1729| state->helo_name = mystrdup(printable(argv[1].strval, '?')); It's suspicious that there is the NULL check, but later it could fail on NULL dereference. The following are few suspicious clang warnings with the codepaths which could trigger them, I haven't done deeper analysis of them: 1. postfix-3.5.8/src/util/dict_inline.c:131:2: warning[core.CallAndMessage]: 2nd function call argument is an uninitialized value # dict->update(dict, vname, value); # ^ ~~~~~ 4. postfix-3.5.8/src/util/dict_inline.c:59:23: note: 'vname' declared without an initial value # char *nameval, *vname, *value; # ^~~~~ 7. postfix-3.5.8/src/util/dict_inline.c:79:9: note: Assuming 'open_flags' is equal to O_RDONLY # if (open_flags != O_RDONLY) # ^~~~~~~~~~~~~~~~~~~~~~ 10. postfix-3.5.8/src/util/dict_inline.c:79:5: note: Taking false branch # if (open_flags != O_RDONLY) # ^ 13. postfix-3.5.8/src/util/dict_inline.c:88:9: note: Assuming 'util_utf8_enable' is 0 # if (DICT_NEED_UTF8_ACTIVATION(util_utf8_enable, dict_flags) # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 16. postfix-3.5.8/src/util/dict.h:176:3: note: expanded from macro 'DICT_NEED_UTF8_ACTIVATION' # ((enable) && ((flags) & DICT_FLAG_UTF8_MASK)) # ^~~~~~~~ 19. postfix-3.5.8/src/util/dict_inline.c:88:9: note: Left side of '&&' is false 20. postfix-3.5.8/src/util/dict.h:176:12: note: expanded from macro 'DICT_NEED_UTF8_ACTIVATION' # ((enable) && ((flags) & DICT_FLAG_UTF8_MASK)) # ^ 23. postfix-3.5.8/src/util/dict_inline.c:101:9: note: Assuming the condition is false # if ((len = balpar(name, CHARS_BRACE)) == 0 || name[len] != 0 # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 26. postfix-3.5.8/src/util/dict_inline.c:101:9: note: Left side of '||' is false 27. postfix-3.5.8/src/util/dict_inline.c:101:51: note: Assuming the condition is false # if ((len = balpar(name, CHARS_BRACE)) == 0 || name[len] != 0 # ^~~~~~~~~~~~~~ 30. postfix-3.5.8/src/util/dict_inline.c:101:9: note: Left side of '||' is false # if ((len = balpar(name, CHARS_BRACE)) == 0 || name[len] != 0 # ^ 33. postfix-3.5.8/src/util/dict_inline.c:102:5: note: Assuming the condition is false # || *(cp = saved_name = mystrndup(name + 1, len - 2)) == 0) # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36. postfix-3.5.8/src/util/dict_inline.c:101:5: note: Taking false branch # if ((len = balpar(name, CHARS_BRACE)) == 0 || name[len] != 0 # ^ 39. postfix-3.5.8/src/util/dict_inline.c:115:12: note: Assuming the condition is true # while ((nameval = mystrtokq(&cp, CHARS_COMMA_SP, CHARS_BRACE)) != 0) { # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 42. postfix-3.5.8/src/util/dict_inline.c:115:5: note: Loop condition is true. Entering loop body # while ((nameval = mystrtokq(&cp, CHARS_COMMA_SP, CHARS_BRACE)) != 0) { # ^ 45. postfix-3.5.8/src/util/dict_inline.c:116:7: note: Assuming the condition is false # if ((nameval[0] != CHARS_BRACE[0] # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ 48. postfix-3.5.8/src/util/dict_inline.c:116:7: note: Left side of '||' is false 49. postfix-3.5.8/src/util/dict_inline.c:117:10: note: Assuming the condition is false # || (err = free_me = extpar(&nameval, CHARS_BRACE, EXTPAR_FLAG_STRIP)) == 0) # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 52. postfix-3.5.8/src/util/dict_inline.c:118:6: note: Left side of '&&' is false # && (err = split_qnameval(nameval, &vname, &value)) != 0) # ^ 55. postfix-3.5.8/src/util/dict_inline.c:121:6: note: Assuming the condition is false # if ((dict->flags & DICT_FLAG_SRC_RHS_IS_FILE) != 0) { # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58. postfix-3.5.8/src/util/dict_inline.c:121:2: note: Taking false branch # if ((dict->flags & DICT_FLAG_SRC_RHS_IS_FILE) != 0) { # ^ 61. postfix-3.5.8/src/util/dict_inline.c:131:2: note: 2nd function call argument is an uninitialized value # dict->update(dict, vname, value); # ^ ~~~~~ # 129| } # 130| /* No duplicate checks. See comments in dict_thash.c. */ # 131|-> dict->update(dict, vname, value); # 132| count += 1; # 133| } 1. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:335:9: warning[core.NullDereference]: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'tp') # if (tp->next) # ^ 4. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:509:5: note: 'head' initialized to a null pointer value # TLS_TLSA *head = 0; # ^~~~~~~~~~~~~~ 7. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:516:9: note: Assuming 'msg_verbose' is 0 # if (msg_verbose) # ^~~~~~~~~~~ 10. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:516:5: note: Taking false branch # if (msg_verbose) # ^ 13. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:519:30: note: Assuming 'ret' is not equal to 1 # for (tpp = &head, n = 0; ret == 1 && n < count; n++, tpp = &tp->next) { # ^~~~~~~~ 16. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:519:39: note: Left side of '&&' is false # for (tpp = &head, n = 0; ret == 1 && n < count; n++, tpp = &tp->next) { # ^ 19. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:540:9: note: 'ret' is not equal to 1 # if (ret != 1) { # ^~~ 22. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:540:5: note: Taking true branch # if (ret != 1) { # ^ 25. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:541:29: note: Passing null pointer value via 1st parameter 'tp' # tls_proxy_client_tlsa_free(head); # ^~~~ 28. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:541:2: note: Calling 'tls_proxy_client_tlsa_free' # tls_proxy_client_tlsa_free(head); # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:335:9: note: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'tp') # if (tp->next) # ^~ # 333| static void tls_proxy_client_tlsa_free(TLS_TLSA *tp) # 334| { # 335|-> if (tp->next) # 336| tls_proxy_client_tlsa_free(tp->next); # 337| myfree(tp->mdalg); 1. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:324:9: warning[core.NullDereference]: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'tp') # if (tp->next) # ^ 4. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:451:5: note: 'head' initialized to a null pointer value # TLS_PKEYS *head = 0; # ^~~~~~~~~~~~~~~ 7. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:458:9: note: Assuming 'msg_verbose' is 0 # if (msg_verbose) # ^~~~~~~~~~~ 10. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:458:5: note: Taking false branch # if (msg_verbose) # ^ 13. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:461:30: note: Assuming 'ret' is not equal to 1 # for (tpp = &head, n = 0; ret == 1 && n < count; n++, tpp = &tp->next) { # ^~~~~~~~ 16. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:461:39: note: Left side of '&&' is false # for (tpp = &head, n = 0; ret == 1 && n < count; n++, tpp = &tp->next) { # ^ 19. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:489:9: note: Assuming 'buf' is null # if (buf) # ^~~ 22. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:489:5: note: Taking false branch # if (buf) # ^ 25. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:491:9: note: 'ret' is not equal to 1 # if (ret != 1) { # ^~~ 28. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:491:5: note: Taking true branch # if (ret != 1) { # ^ 31. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:492:30: note: Passing null pointer value via 1st parameter 'tp' # tls_proxy_client_pkeys_free(head); # ^~~~ 34. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:492:2: note: Calling 'tls_proxy_client_pkeys_free' # tls_proxy_client_pkeys_free(head); # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:324:9: note: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'tp') # if (tp->next) # ^~ # 322| static void tls_proxy_client_pkeys_free(TLS_PKEYS *tp) # 323| { # 324|-> if (tp->next) # 325| tls_proxy_client_pkeys_free(tp->next); # 326| if (tp->pkey) 1. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:313:9: warning[core.NullDereference]: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'tp') # if (tp->next) # ^ 4. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:392:5: note: 'head' initialized to a null pointer value # TLS_CERTS *head = 0; # ^~~~~~~~~~~~~~~ 7. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:399:9: note: Assuming 'msg_verbose' is 0 # if (msg_verbose) # ^~~~~~~~~~~ 10. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:399:5: note: Taking false branch # if (msg_verbose) # ^ 13. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:402:30: note: Assuming 'ret' is not equal to 1 # for (tpp = &head, n = 0; ret == 1 && n < count; n++, tpp = &tp->next) { # ^~~~~~~~ 16. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:402:39: note: Left side of '&&' is false # for (tpp = &head, n = 0; ret == 1 && n < count; n++, tpp = &tp->next) { # ^ 19. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:430:9: note: 'buf' is null # if (buf) # ^~~ 22. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:430:5: note: Taking false branch # if (buf) # ^ 25. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:432:9: note: 'ret' is not equal to 1 # if (ret != 1) { # ^~~ 28. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:432:5: note: Taking true branch # if (ret != 1) { # ^ 31. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:433:30: note: Passing null pointer value via 1st parameter 'tp' # tls_proxy_client_certs_free(head); # ^~~~ 34. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:433:2: note: Calling 'tls_proxy_client_certs_free' # tls_proxy_client_certs_free(head); # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37. postfix-3.5.8/src/tls/tls_proxy_client_scan.c:313:9: note: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'tp') # if (tp->next) # ^~ # 311| static void tls_proxy_client_certs_free(TLS_CERTS *tp) # 312| { # 313|-> if (tp->next) # 314| tls_proxy_client_certs_free(tp->next); # 315| if (tp->cert) 1. postfix-3.5.8/src/global/maillog_client.c:256:10: warning[core.NonNullParamChecker]: Null pointer passed to 2nd parameter expecting 'nonnull' # if (setenv(POSTLOG_SERVICE_ENV, service_path, 1) < 0) # ^ ~~~~~~~~~~~~ 4. postfix-3.5.8/src/global/maillog_client.c:170:10: note: Value assigned to 'import_service_path' # if ((import_service_path = safe_getenv(POSTLOG_SERVICE_ENV)) != 0 # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7. postfix-3.5.8/src/global/maillog_client.c:170:9: note: Assuming pointer value is null # if ((import_service_path = safe_getenv(POSTLOG_SERVICE_ENV)) != 0 # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 10. postfix-3.5.8/src/global/maillog_client.c:171:2: note: Left side of '&&' is false # && *import_service_path == 0) # ^ 13. postfix-3.5.8/src/global/maillog_client.c:173:9: note: Assuming the condition is false # if ((import_hostname = safe_getenv(POSTLOG_HOSTNAME_ENV)) != 0 # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 16. postfix-3.5.8/src/global/maillog_client.c:174:2: note: Left side of '&&' is false # && *import_hostname == 0) # ^ 19. postfix-3.5.8/src/global/maillog_client.c:193:9: note: Assuming 'var_maillog_file' is non-null # if (var_maillog_file ? *var_maillog_file == 0 : import_service_path == 0) { # ^~~~~~~~~~~~~~~~ 22. postfix-3.5.8/src/global/maillog_client.c:193:9: note: '?' condition is true 23. postfix-3.5.8/src/global/maillog_client.c:193:28: note: Assuming the condition is false # if (var_maillog_file ? *var_maillog_file == 0 : import_service_path == 0) { # ^~~~~~~~~~~~~~~~~~~~~~ 26. postfix-3.5.8/src/global/maillog_client.c:193:5: note: Taking false branch # if (var_maillog_file ? *var_maillog_file == 0 : import_service_path == 0) { # ^ 29. postfix-3.5.8/src/global/maillog_client.c:207:9: note: 'logger_mode' is equal to MAILLOG_CLIENT_MODE_POSTLOG # if (logger_mode == MAILLOG_CLIENT_MODE_POSTLOG) { # ^~~~~~~~~~~ 32. postfix-3.5.8/src/global/maillog_client.c:207:5: note: Taking true branch # if (logger_mode == MAILLOG_CLIENT_MODE_POSTLOG) { # ^ 35. postfix-3.5.8/src/global/maillog_client.c:211:6: note: 'var_maillog_file' is non-null # if (var_maillog_file && *var_maillog_file) { # ^~~~~~~~~~~~~~~~ 38. postfix-3.5.8/src/global/maillog_client.c:211:6: note: Left side of '&&' is true 39. postfix-3.5.8/src/global/maillog_client.c:211:2: note: Taking true branch # if (var_maillog_file && *var_maillog_file) { # ^ 42. postfix-3.5.8/src/global/maillog_client.c:216:6: note: Loop condition is true. Entering loop body # for (cpp = good_prefixes->argv; /* see below */ ; cpp++) { # ^ 45. postfix-3.5.8/src/global/maillog_client.c:217:7: note: Assuming the condition is false # if (*cpp == 0) # ^~~~~~~~~ 48. postfix-3.5.8/src/global/maillog_client.c:217:3: note: Taking false branch # if (*cpp == 0) # ^ 51. postfix-3.5.8/src/global/maillog_client.c:221:3: note: Taking true branch # if (strncmp(var_maillog_file, *cpp, strlen(*cpp)) == 0) # ^ 54. postfix-3.5.8/src/global/maillog_client.c:222:7: note: Execution continues on line 224 # break; # ^ 57. postfix-3.5.8/src/global/maillog_client.c:226:6: note: Assuming 'var_myhostname' is non-null # if (var_myhostname && *var_myhostname) { # ^~~~~~~~~~~~~~ 60. postfix-3.5.8/src/global/maillog_client.c:226:6: note: Left side of '&&' is true 61. postfix-3.5.8/src/global/maillog_client.c:226:24: note: Assuming the condition is true # if (var_myhostname && *var_myhostname) { # ^~~~~~~~~~~~~~~ 64. postfix-3.5.8/src/global/maillog_client.c:226:2: note: Taking true branch # if (var_myhostname && *var_myhostname) { # ^ 67. postfix-3.5.8/src/global/maillog_client.c:234:6: note: Assuming 'var_postlog_service' is null # if (var_postlog_service) { # ^~~~~~~~~~~~~~~~~~~ 70. postfix-3.5.8/src/global/maillog_client.c:234:2: note: Taking false branch # if (var_postlog_service) { # ^ 73. postfix-3.5.8/src/global/maillog_client.c:238:6: note: Null pointer value stored to 'service_path' # service_path = import_service_path; # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 76. postfix-3.5.8/src/global/maillog_client.c:242:5: note: Assuming the condition is false # (flags & MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK) ? # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79. postfix-3.5.8/src/global/maillog_client.c:242:4: note: '?' condition is false # (flags & MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK) ? # ^ 82. postfix-3.5.8/src/global/maillog_client.c:251:6: note: 'import_service_path' is equal to null # if (import_service_path == 0 # ^~~~~~~~~~~~~~~~~~~ 85. postfix-3.5.8/src/global/maillog_client.c:252:6: note: Left side of '||' is true # || strcmp(service_path, import_service_path) != 0) { # ^ 88. postfix-3.5.8/src/global/maillog_client.c:256:10: note: Null pointer passed to 2nd parameter expecting 'nonnull' # if (setenv(POSTLOG_SERVICE_ENV, service_path, 1) < 0) # ^ ~~~~~~~~~~~~ # 254| msg_info("export %s=%s", POSTLOG_SERVICE_ENV, service_path); # 255| #endif # 256|-> if (setenv(POSTLOG_SERVICE_ENV, service_path, 1) < 0) # 257| msg_fatal("setenv: %m"); # 258| } 1. postfix-3.5.8/src/global/mail_task.c:74:13: warning[core.NullDereference]: Dereference of null pointer # return (vstring_str(canon_name)); # ^~~~~~~~~~~~~~~~~~~~~~~ 4. postfix-3.5.8/include/vstring.h:70:36: note: expanded from macro 'vstring_str' # #define vstring_str(vp) ((char *) (vp)->vbuf.data) # ^~~~~~~~~~~~~~~ 7. postfix-3.5.8/src/global/mail_task.c:58:5: note: 'canon_name' initialized to a null pointer value # static VSTRING *canon_name; # ^~~~~~~~~~~~~~~~~~~~~~~~~~ 10. postfix-3.5.8/src/global/mail_task.c:62:9: note: Assuming 'argv0' is null # if (argv0) { # ^~~~~ 13. postfix-3.5.8/src/global/mail_task.c:62:5: note: Taking false branch # if (argv0) { # ^ 16. postfix-3.5.8/src/global/mail_task.c:74:13: note: Dereference of null pointer # return (vstring_str(canon_name)); # ^~~~~~~~~~~~~~~~~~~~~~~ 19. postfix-3.5.8/include/vstring.h:70:36: note: expanded from macro 'vstring_str' # #define vstring_str(vp) ((char *) (vp)->vbuf.data) # ^~~~~~~~~~~~~~~ # 72| vstring_sprintf(canon_name, "%s/%s", tag, argv0); # 73| } # 74|-> return (vstring_str(canon_name)); # 75| } thanks & regards Jaroslav