Changeset View
Changeset View
Standalone View
Standalone View
agent/genkey.c
Context not available. | |||||
{ | { | ||||
gpg_error_t err = 0; | gpg_error_t err = 0; | ||||
const char *pgmname = gnupg_module_name (GNUPG_MODULE_NAME_CHECK_PATTERN); | const char *pgmname = gnupg_module_name (GNUPG_MODULE_NAME_CHECK_PATTERN); | ||||
FILE *infp; | estream_t stream_to_check_pattern = NULL; | ||||
const char *argv[10]; | const char *argv[10]; | ||||
pid_t pid; | pid_t pid; | ||||
int result, i; | int result, i; | ||||
Context not available. | |||||
return 1; /* Do not pass the check. */ | return 1; /* Do not pass the check. */ | ||||
} | } | ||||
infp = gnupg_tmpfile (); | |||||
if (!infp) | |||||
{ | |||||
err = gpg_error_from_syserror (); | |||||
log_error (_("error creating temporary file: %s\n"), gpg_strerror (err)); | |||||
xfree (patternfname); | |||||
return 1; /* Error - assume password should not be used. */ | |||||
} | |||||
if (fwrite (pw, strlen (pw), 1, infp) != 1) | |||||
{ | |||||
err = gpg_error_from_syserror (); | |||||
log_error (_("error writing to temporary file: %s\n"), | |||||
gpg_strerror (err)); | |||||
fclose (infp); | |||||
xfree (patternfname); | |||||
return 1; /* Error - assume password should not be used. */ | |||||
} | |||||
fseek (infp, 0, SEEK_SET); | |||||
clearerr (infp); | |||||
i = 0; | i = 0; | ||||
argv[i++] = "--null"; | argv[i++] = "--null"; | ||||
argv[i++] = "--", | argv[i++] = "--", | ||||
Context not available. | |||||
argv[i] = NULL; | argv[i] = NULL; | ||||
log_assert (i < sizeof argv); | log_assert (i < sizeof argv); | ||||
if (gnupg_spawn_process_fd (pgmname, argv, fileno (infp), -1, -1, &pid)) | if (gnupg_spawn_process (pgmname, argv, NULL, NULL, 0, | ||||
&stream_to_check_pattern, NULL, NULL, &pid)) | |||||
result = 1; /* Execute error - assume password should no be used. */ | result = 1; /* Execute error - assume password should no be used. */ | ||||
else if (gnupg_wait_process (pgmname, pid, 1, NULL)) | |||||
result = 1; /* Helper returned an error - probably a match. */ | |||||
else | else | ||||
result = 0; /* Success; i.e. no match. */ | { | ||||
gnupg_release_process (pid); | es_set_binary (stream_to_check_pattern); | ||||
if (es_fwrite (pw, strlen (pw), 1, stream_to_check_pattern) != 1) | |||||
/* Overwrite our temporary file. */ | { | ||||
fseek (infp, 0, SEEK_SET); | err = gpg_error_from_syserror (); | ||||
clearerr (infp); | log_error (_("error writing to pipe: %s\n"), gpg_strerror (err)); | ||||
for (i=((strlen (pw)+99)/100)*100; i > 0; i--) | result = 1; /* Error - assume password should not be used. */ | ||||
putc ('\xff', infp); | } | ||||
fflush (infp); | else | ||||
fclose (infp); | es_fflush (stream_to_check_pattern); | ||||
es_fclose (stream_to_check_pattern); | |||||
if (gnupg_wait_process (pgmname, pid, 1, NULL)) | |||||
result = 1; /* Helper returned an error - probably a match. */ | |||||
else | |||||
result = 0; /* Success; i.e. no match. */ | |||||
gnupg_release_process (pid); | |||||
} | |||||
xfree (patternfname); | xfree (patternfname); | ||||
return result; | return result; | ||||
Context not available. |