Re: reading uninitialized buffer - Mailing list pgsql-patches
| From | Andrew Dunstan |
|---|---|
| Subject | Re: reading uninitialized buffer |
| Date | |
| Msg-id | 401D48B4.2040808@dunslane.net Whole thread Raw |
| In response to | Re: reading uninitialized buffer (Dennis Bjorklund <db@zigo.dhs.org>) |
| Responses |
Re: reading uninitialized buffer
Re: reading uninitialized buffer |
| List | pgsql-patches |
OK, then *This* patch does it the way I think is clearest. Most of it is
just reindenting.
cheers
andrew
Dennis Bjorklund wrote:
>On Sun, 1 Feb 2004, Andrew Dunstan wrote:
>
>
>
>>As for the test being outside the "if" statement, it is true that that
>>might waste a few cycles, but it hardly matters.
>>
>>
>
>The cycles are not important. My "fix" wasn't the most optimized either if
>one should count cycles. It was terminating the string twice in some
>cases. That I thought about and came to the conclusion that it was not
>important. That I didn't rewrite the strncmp() to strcmp() is strange to
>me, the length is obviously not needed. Good thing you looked at it.
>
>
>
>>Personally, I would prefer to replace the if statement with this:
>>
>> if (c == EOF || c == '\n')
>> {
>> *buf = '\0';
>> return;
>> }
>>
>>and then it wouldn't be an issue at all, but I know some people don't
>>like early function returns - is there a general postgres style rule
>>
>>
>
>I don't know what the style rules say. I have nothing against early
>returns if used with grace. Early exits for odd cases, before the main
>part of the function, just helps readability if you ask me. On the other
>hand it does not matter since the correct is always to use whatever style
>the rest of the program uses.
>
>
>
Index: src/backend/libpq/hba.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/libpq/hba.c,v
retrieving revision 1.119
diff -c -r1.119 hba.c
*** src/backend/libpq/hba.c 25 Dec 2003 03:44:04 -0000 1.119
--- src/backend/libpq/hba.c 1 Feb 2004 17:17:34 -0000
***************
*** 105,187 ****
while ((c = getc(fp)) != EOF && (pg_isblank(c) || c == ','))
;
! if (c != EOF && c != '\n')
{
! /*
! * Build a token in buf of next characters up to EOF, EOL,
! * unquoted comma, or unquoted whitespace.
! */
! while (c != EOF && c != '\n' &&
! (!pg_isblank(c) || in_quote == true))
{
! /* skip comments to EOL */
! if (c == '#' && !in_quote)
! {
! while ((c = getc(fp)) != EOF && c != '\n')
! ;
! /* If only comment, consume EOL too; return EOL */
! if (c != EOF && buf == start_buf)
! c = getc(fp);
! break;
! }
!
! if (buf >= end_buf)
! {
! ereport(LOG,
! (errcode(ERRCODE_CONFIG_FILE_ERROR),
! errmsg("authentication file token too long, skipping: \"%s\"",
! buf)));
! /* Discard remainder of line */
! while ((c = getc(fp)) != EOF && c != '\n')
! ;
! buf[0] = '\0';
! break;
! }
!
! if (c != '"' || (c == '"' && was_quote))
! *buf++ = c;
!
! /* We pass back the comma so the caller knows there is more */
! if ((pg_isblank(c) || c == ',') && !in_quote)
! break;
!
! /* Literal double-quote is two double-quotes */
! if (in_quote && c == '"')
! was_quote = !was_quote;
! else
! was_quote = false;
!
! if (c == '"')
! {
! in_quote = !in_quote;
! saw_quote = true;
! }
! c = getc(fp);
}
! /*
! * Put back the char right after the token (critical in case it is
! * EOL, since we need to detect end-of-line at next call).
! */
! if (c != EOF)
! ungetc(c, fp);
}
if ( !saw_quote &&
(
! strncmp(start_buf,"all",3) == 0 ||
! strncmp(start_buf,"sameuser",8) == 0 ||
! strncmp(start_buf,"samegroup",9) == 0
)
)
{
/* append newline to a magical keyword */
*buf++ = '\n';
}
- *buf = '\0';
}
--- 105,191 ----
while ((c = getc(fp)) != EOF && (pg_isblank(c) || c == ','))
;
! if (c == EOF || c == '\n')
{
! *buf = '\0';
! return;
! }
!
! /*
! * Build a token in buf of next characters up to EOF, EOL,
! * unquoted comma, or unquoted whitespace.
! */
! while (c != EOF && c != '\n' &&
! (!pg_isblank(c) || in_quote == true))
! {
! /* skip comments to EOL */
! if (c == '#' && !in_quote)
{
! while ((c = getc(fp)) != EOF && c != '\n')
! ;
! /* If only comment, consume EOL too; return EOL */
! if (c != EOF && buf == start_buf)
! c = getc(fp);
! break;
! }
! if (buf >= end_buf)
! {
! ereport(LOG,
! (errcode(ERRCODE_CONFIG_FILE_ERROR),
! errmsg("authentication file token too long, skipping: \"%s\"",
! buf)));
! /* Discard remainder of line */
! while ((c = getc(fp)) != EOF && c != '\n')
! ;
! buf[0] = '\0';
! break;
}
! if (c != '"' || (c == '"' && was_quote))
! *buf++ = c;
!
! /* We pass back the comma so the caller knows there is more */
! if ((pg_isblank(c) || c == ',') && !in_quote)
! break;
!
! /* Literal double-quote is two double-quotes */
! if (in_quote && c == '"')
! was_quote = !was_quote;
! else
! was_quote = false;
!
! if (c == '"')
! {
! in_quote = !in_quote;
! saw_quote = true;
! }
!
! c = getc(fp);
}
+ /*
+ * Put back the char right after the token (critical in case it is
+ * EOL, since we need to detect end-of-line at next call).
+ */
+ if (c != EOF)
+ ungetc(c, fp);
+
+ *buf = '\0';
if ( !saw_quote &&
(
! strcmp(start_buf,"all") == 0 ||
! strcmp(start_buf,"sameuser") == 0 ||
! strcmp(start_buf,"samegroup") == 0
)
)
{
/* append newline to a magical keyword */
*buf++ = '\n';
+ *buf = '\0';
}
}
pgsql-patches by date: