mirror of
https://github.com/shadow-maint/shadow.git
synced 2026-01-26 14:03:17 +00:00
fgets(3) returns either NULL or the input pointer. Checking for NULL is more explicit, and simpler. <stddef.h> is the header that provides NULL; add it where appropriate. The meat of this patch can be approximated with the following semantic patch: $ cat ~/tmp/spatch/fgets_null.sp @@ expression a, b, c; @@ - fgets(a, b, c) == a + fgets(a, b, c) != NULL @@ expression a, b, c; @@ - fgetsx(a, b, c) == a + fgetsx(a, b, c) != NULL @@ expression a, b, c, p; @@ - p->cio_fgets(a, b, c) == a + p->cio_fgets(a, b, c) != NULL @@ expression a, b, c; @@ - fgets(a, b, c) != a + fgets(a, b, c) == NULL @@ expression a, b, c; @@ - fgetsx(a, b, c) != a + fgetsx(a, b, c) == NULL @@ expression a, b, c, p; @@ - p->cio_fgets(a, b, c) != a + p->cio_fgets(a, b, c) == NUL Applied as $ find contrib/ lib* src/ -type f \ | xargs spatch --sp-file ~/tmp/spatch/fgets_null.sp --in-place; The differences between the actual patch and the approximation via the semantic patch from above are includes, whitespace, braces, and a case where there was an implicit pointer-to-bool comparison which I made explicit. When reviewing, it'll be useful to use git-diff(1) with '-w' and '--color-words=.'. Signed-off-by: Alejandro Colomar <alx@kernel.org>
89 lines
1.9 KiB
C
89 lines
1.9 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 1990 , Julianne Frances Haugh
|
|
* SPDX-FileCopyrightText: 1996 - 1997, Marek Michałkiewicz
|
|
* SPDX-FileCopyrightText: 2003 - 2005, Tomasz Kłoczko
|
|
* SPDX-FileCopyrightText: 2007 , Nicolas François
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include "fields.h"
|
|
|
|
#include <ctype.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include "prototypes.h"
|
|
#include "string/ctype/strisascii/strisprint.h"
|
|
#include "string/ctype/strchrisascii/strchriscntrl.h"
|
|
#include "string/strcmp/streq.h"
|
|
#include "string/strspn/stpspn.h"
|
|
#include "string/strspn/stprspn.h"
|
|
#include "string/strtok/stpsep.h"
|
|
|
|
|
|
/*
|
|
* valid_field - insure that a field contains all legal characters
|
|
*
|
|
* Return:
|
|
* -1 Illegal or control characters are present.
|
|
* 1 Non-ASCII characters are present.
|
|
* 0 All chatacters are legal and ASCII.
|
|
*/
|
|
int
|
|
valid_field_(const char *field, const char *illegal)
|
|
{
|
|
if (NULL == field)
|
|
return -1;
|
|
|
|
if (strpbrk(field, illegal))
|
|
return -1;
|
|
if (strchriscntrl(field))
|
|
return -1;
|
|
if (strisprint(field))
|
|
return 0;
|
|
if (streq(field, ""))
|
|
return 0;
|
|
|
|
return 1; // !ASCII
|
|
}
|
|
|
|
/*
|
|
* change_field - change a single field if a new value is given.
|
|
*
|
|
* prompt the user with the name of the field being changed and the
|
|
* current value.
|
|
*/
|
|
void
|
|
change_field(char *buf, size_t maxsize, const char *prompt)
|
|
{
|
|
char newf[200];
|
|
char *cp;
|
|
|
|
if (maxsize > sizeof(newf)) {
|
|
maxsize = sizeof(newf);
|
|
}
|
|
|
|
printf ("\t%s [%s]: ", prompt, buf);
|
|
(void) fflush (stdout);
|
|
if (fgets(newf, maxsize, stdin) == NULL)
|
|
return;
|
|
|
|
if (stpsep(newf, "\n") == NULL)
|
|
return;
|
|
|
|
if (!streq(newf, "")) {
|
|
/*
|
|
* Remove leading and trailing whitespace. This also
|
|
* makes it possible to change the field to empty, by
|
|
* entering a space. --marekm
|
|
*/
|
|
stpcpy(stprspn(newf, " \t"), "");
|
|
cp = stpspn(newf, " \t");
|
|
strcpy (buf, cp);
|
|
}
|
|
}
|