diff options
Diffstat (limited to 'lib/env.c')
-rw-r--r-- | lib/env.c | 66 |
1 files changed, 49 insertions, 17 deletions
@@ -96,3 +96,3 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) - while (p = fgets(buf, sizeof buf, fp)) { + while ((p = fgets(buf, sizeof buf, fp))) { int len; @@ -107,6 +107,14 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) if (p[len-1] != '\n') { - if (!slist) + if (!slist) { slist = gray_slist_create(); - gray_slist_append(slist, p, len); - while (p = fgets(buf, sizeof buf, fp)) { + if (!slist) { + rc = errno; + break; + } + } + if (gray_slist_append(slist, p, len) != len) { + rc = errno; + break; + } + while ((p = fgets(buf, sizeof buf, fp))) { len = strlen(p); @@ -116,4 +124,7 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) } - gray_slist_append_char(slist, 0); - p = gray_slist_finish(slist); + if (gray_slist_append_char(slist, 0) != 1 + || (p = gray_slist_finish(slist)) == NULL) { + rc = errno; + break; + } len = strlen(p); @@ -131,6 +142,15 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) /* Collect continuation lines */ - if (!slist) + if (!slist) { slist = gray_slist_create(); + if (!slist) { + rc = errno; + break; + } + } do { - gray_slist_append(slist, p, len - 1); + if (gray_slist_append(slist, p, len - 1) + != len - 1) { + rc = errno; + break; + } p = fgets (buf, sizeof buf, fp); @@ -152,6 +172,15 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) } while (p[len-1] == '\\'); - if (len) - gray_slist_append(slist, p, len); - gray_slist_append_char(slist, 0); - p = gray_slist_finish(slist); + if (rc) + break; + if (len) { + if (gray_slist_append(slist, p, len) != len) { + rc = errno; + break; + } + } + if (gray_slist_append_char(slist, 0) != 1 + || (p = gray_slist_finish(slist)) == NULL) { + rc = errno; + break; + } if (err) @@ -162,4 +191,3 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) if (!env) { - _pam_log(LOG_EMERG, "not enough memory"); - rc = 1; + rc = errno; break; @@ -169,5 +197,4 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) if (!env->name) { - _pam_log(LOG_EMERG, "not enough memory"); + rc = errno; free(env); - rc = 1; break; @@ -197,3 +224,8 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) fclose(fp); - *penv = config_env; + if (rc) { + _pam_log(LOG_EMERG, "%s", strerror(rc)); + gray_env_free(config_env); + } else { + *penv = config_env; + } return rc; |