]> granicus.if.org Git - apache/commitdiff
htdbm, htpasswd: print error message if out of memory
authorStefan Fritsch <sf@apache.org>
Tue, 25 Dec 2012 21:16:17 +0000 (21:16 +0000)
committerStefan Fritsch <sf@apache.org>
Tue, 25 Dec 2012 21:16:17 +0000 (21:16 +0000)
PR: 54345

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1425775 13f79535-47bb-0310-9956-ffa450edef68

support/htdbm.c
support/htpasswd.c
support/passwd_common.c
support/passwd_common.h

index a99a2322671cdf635ecf10747f3f6a994a2dd77e..1452d7a0eb89ac2693410b51e78fc129114ac914 100644 (file)
@@ -110,6 +110,7 @@ static apr_status_t htdbm_init(apr_pool_t **pool, htdbm_t **hdbm)
 #endif
 
     apr_pool_create( pool, NULL);
+    apr_pool_abort_set(abort_on_oom, *pool);
     apr_file_open_stderr(&errfile, *pool);
     apr_signal(SIGINT, (void (*)(int)) htdbm_interrupted);
 
index 51219c0d9679cc00905fcf70f8775c83a819f932..0989fd81b39c2917bbe0970789a6f66e9ac5580c 100644 (file)
@@ -274,6 +274,7 @@ int main(int argc, const char * const argv[])
     apr_app_initialize(&argc, &argv, NULL);
     atexit(terminate);
     apr_pool_create(&pool, NULL);
+    apr_pool_abort_set(abort_on_oom, pool);
     apr_file_open_stderr(&errfile, pool);
     ctx.pool = pool;
     ctx.alg = ALG_APMD5;
index ab720279c273371f6f2195f6fb7fc8a25f242571..7636835902c3db7c16460fe27908adfcecdc598d 100644 (file)
 
 apr_file_t *errfile;
 
+int abort_on_oom(int rc)
+{
+    const char *buf = "Error: out of memory\n";
+    int written, count = strlen(buf);
+    do {
+        written = write(STDERR_FILENO, buf, count);
+        if (written == count)
+            break;
+        if (written > 0) {
+            buf += written;
+            count -= written;
+        }
+    } while (written >= 0 || errno == EINTR);
+    abort();
+    /* NOTREACHED */
+    return 0;
+}
+
 static int generate_salt(char *s, size_t size, const char **errstr,
                          apr_pool_t *pool)
 {
@@ -207,6 +225,8 @@ int mkhash(struct passwd_ctx *ctx)
         apr_cpystrn(ctx->out, cbuf, ctx->out_len - 1);
         if (strlen(pw) > 8) {
             char *truncpw = strdup(pw);
+            if (truncpw == NULL)
+                abort_on_oom(0);
             truncpw[8] = '\0';
             if (!strcmp(ctx->out, crypt(truncpw, salt))) {
                 apr_file_printf(errfile, "Warning: Password truncated to 8 "
index 67b66da161417b7abe14b72ba17b27f18b98fc08..672ad5c3c74bb6a21e2e0858322fa29c5e1d97ca 100644 (file)
@@ -84,6 +84,12 @@ struct passwd_ctx {
     } passwd_src;
 };
 
+
+/*
+ * To be used as apr_pool_abort_fn
+ */
+int abort_on_oom(int rc);
+
 /*
  * Write a line to the file. On error, print a message and exit
  */