From: Timo Sirainen Date: Fri, 19 Aug 2016 10:15:09 +0000 (+0300) Subject: global: Added uchar_empty_ptr and use it instead of &uchar_nul. X-Git-Tag: 2.3.0.rc1~3108 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5965eaa2d972e6264cecaf54091cd43019bc7d1f;p=thirdparty%2Fdovecot%2Fcore.git global: Added uchar_empty_ptr and use it instead of &uchar_nul. This makes Coverity happier about not treating a char as an array. For now this is a pointer to a 0, but could as well become a pointer that crashes if dereferenced. Shouldn't be NULL anyway because clang's -fsanitize=nonnull-attribute will complain about them. --- diff --git a/src/auth/auth-master-connection.c b/src/auth/auth-master-connection.c index 804b0d0229..ebefe5faa6 100644 --- a/src/auth/auth-master-connection.c +++ b/src/auth/auth-master-connection.c @@ -419,14 +419,14 @@ master_input_pass(struct auth_master_connection *conn, const char *args) return FALSE; auth_request_log_info(auth_request, "passdb", "%s", error); pass_callback(PASSDB_RESULT_USER_UNKNOWN, - &uchar_nul, 0, auth_request); + uchar_empty_ptr, 0, auth_request); } else if (conn->userdb_restricted_uid != 0) { /* no permissions to do this lookup */ auth_request_log_error(auth_request, "passdb", "Auth client doesn't have permissions to do " "a PASS lookup: %s", auth_restricted_reason(conn)); pass_callback(PASSDB_RESULT_INTERNAL_FAILURE, - &uchar_nul, 0, auth_request); + uchar_empty_ptr, 0, auth_request); } else { auth_request_set_state(auth_request, AUTH_REQUEST_STATE_MECH_CONTINUE); diff --git a/src/auth/auth-request-handler.c b/src/auth/auth-request-handler.c index d329a82eee..f1ce54518f 100644 --- a/src/auth/auth-request-handler.c +++ b/src/auth/auth-request-handler.c @@ -829,7 +829,7 @@ void auth_request_handler_flush_failures(bool flush_all) i_assert(auth_request->state == AUTH_REQUEST_STATE_FINISHED); auth_request_handler_reply(auth_request, AUTH_CLIENT_RESULT_FAILURE, - &uchar_nul, 0); + uchar_empty_ptr, 0); auth_request_unref(&auth_request); } } diff --git a/src/auth/auth-request.c b/src/auth/auth-request.c index 56b5a3d092..63961194ae 100644 --- a/src/auth/auth-request.c +++ b/src/auth/auth-request.c @@ -1116,7 +1116,7 @@ void auth_request_lookup_credentials_policy_continue(struct auth_request *reques "passdb doesn't support credential lookups"); auth_request_lookup_credentials_callback( PASSDB_RESULT_SCHEME_NOT_AVAILABLE, - &uchar_nul, 0, request); + uchar_empty_ptr, 0, request); } else if (passdb->passdb->blocking) { passdb_blocking_lookup_credentials(request); } else { diff --git a/src/auth/mech.c b/src/auth/mech.c index 39927bb790..001deecffd 100644 --- a/src/auth/mech.c +++ b/src/auth/mech.c @@ -50,7 +50,7 @@ void mech_generic_auth_initial(struct auth_request *request, const unsigned char *data, size_t data_size) { if (data == NULL) { - auth_request_handler_reply_continue(request, &uchar_nul, 0); + auth_request_handler_reply_continue(request, uchar_empty_ptr, 0); } else { /* initial reply given, even if it was 0 bytes */ request->mech->auth_continue(request, data, data_size); diff --git a/src/auth/userdb-static.c b/src/auth/userdb-static.c index bf8c9af093..5578512300 100644 --- a/src/auth/userdb-static.c +++ b/src/auth/userdb-static.c @@ -101,7 +101,7 @@ static void static_lookup(struct auth_request *auth_request, } else { static_credentials_callback( PASSDB_RESULT_SCHEME_NOT_AVAILABLE, - &uchar_nul, 0, auth_request); + uchar_empty_ptr, 0, auth_request); } } else { static_lookup_real(auth_request, callback); diff --git a/src/lib-imap/imap-parser.c b/src/lib-imap/imap-parser.c index 8715e310ee..6fb21f366a 100644 --- a/src/lib-imap/imap-parser.c +++ b/src/lib-imap/imap-parser.c @@ -516,7 +516,7 @@ static bool imap_parser_read_literal_data(struct imap_parser *parser, } else { /* we want to save only literal size, not the literal itself. */ parser->literal_size_return = TRUE; - imap_parser_save_arg(parser, &uchar_nul, 0); + imap_parser_save_arg(parser, uchar_empty_ptr, 0); return FALSE; } } diff --git a/src/lib-sasl/mech-login.c b/src/lib-sasl/mech-login.c index daae7e32fd..4c202ab896 100644 --- a/src/lib-sasl/mech-login.c +++ b/src/lib-sasl/mech-login.c @@ -51,7 +51,7 @@ mech_login_output(struct dsasl_client *_client, switch (client->state) { case STATE_INIT: - *output_r = &uchar_nul; + *output_r = uchar_empty_ptr; *output_len_r = 0; return 0; case STATE_USER: diff --git a/src/lib/istream.c b/src/lib/istream.c index b08ae4f3c8..d26e119618 100644 --- a/src/lib/istream.c +++ b/src/lib/istream.c @@ -503,7 +503,7 @@ i_stream_get_data(struct istream *stream, size_t *size_r) if (_stream->skip >= _stream->pos) { *size_r = 0; - return &uchar_nul; + return uchar_empty_ptr; } if (i_stream_is_buffer_invalid(_stream)) { @@ -528,7 +528,7 @@ i_stream_get_data(struct istream *stream, size_t *size_r) _stream->skip = _stream->pos = 0; stream->eof = FALSE; } - return &uchar_nul; + return uchar_empty_ptr; } *size_r = _stream->pos - _stream->skip; diff --git a/src/lib/strfuncs.c b/src/lib/strfuncs.c index 5467facaa5..4ca9c01ee7 100644 --- a/src/lib/strfuncs.c +++ b/src/lib/strfuncs.c @@ -19,6 +19,7 @@ enum _str_trim_sides { }; const unsigned char uchar_nul = '\0'; +const unsigned char *uchar_empty_ptr = { 0 }; int i_snprintf(char *dest, size_t max_chars, const char *format, ...) { diff --git a/src/lib/strfuncs.h b/src/lib/strfuncs.h index 836c210d75..338fd7a8c8 100644 --- a/src/lib/strfuncs.h +++ b/src/lib/strfuncs.h @@ -4,6 +4,7 @@ #define MAX_INT_STRLEN ((sizeof(uintmax_t) * CHAR_BIT + 2) / 3 + 1) extern const unsigned char uchar_nul; /* (const unsigned char *)"" */ +extern const unsigned char *uchar_empty_ptr; /* non-NULL pointer that shouldn't be dereferenced. */ /* Returns -1 if dest wasn't large enough, 0 if not. */ int i_snprintf(char *dest, size_t max_chars, const char *format, ...)