From owner-freebsd-bugs@FreeBSD.ORG Thu Dec 19 20:30:00 2013 Return-Path: Delivered-To: freebsd-bugs@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id B8C7F4E7 for ; Thu, 19 Dec 2013 20:30:00 +0000 (UTC) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 93B22161B for ; Thu, 19 Dec 2013 20:30:00 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.7/8.14.7) with ESMTP id rBJKU0Bi091532 for ; Thu, 19 Dec 2013 20:30:00 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.7/8.14.7/Submit) id rBJKU0N8091531; Thu, 19 Dec 2013 20:30:00 GMT (envelope-from gnats) Resent-Date: Thu, 19 Dec 2013 20:30:00 GMT Resent-Message-Id: <201312192030.rBJKU0N8091531@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Jeremy Huddleston Sequoia Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id EE76F49C for ; Thu, 19 Dec 2013 20:27:28 +0000 (UTC) Received: from oldred.freebsd.org (oldred.freebsd.org [IPv6:2001:1900:2254:206a::50:4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id DA6CC1604 for ; Thu, 19 Dec 2013 20:27:28 +0000 (UTC) Received: from oldred.freebsd.org ([127.0.1.6]) by oldred.freebsd.org (8.14.5/8.14.7) with ESMTP id rBJKRSFk038482 for ; Thu, 19 Dec 2013 20:27:28 GMT (envelope-from nobody@oldred.freebsd.org) Received: (from nobody@localhost) by oldred.freebsd.org (8.14.5/8.14.5/Submit) id rBJKRSJR038481; Thu, 19 Dec 2013 20:27:28 GMT (envelope-from nobody) Message-Id: <201312192027.rBJKRSJR038481@oldred.freebsd.org> Date: Thu, 19 Dec 2013 20:27:28 GMT From: Jeremy Huddleston Sequoia To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Subject: misc/185010: atexit() does not set errno on error X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 19 Dec 2013 20:30:00 -0000 >Number: 185010 >Category: misc >Synopsis: atexit() does not set errno on error >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu Dec 19 20:30:00 UTC 2013 >Closed-Date: >Last-Modified: >Originator: Jeremy Huddleston Sequoia >Release: HEAD >Organization: Apple Inc >Environment: N/A >Description: On error, atexit() should return -1 and set errno appropriately, but I just noticed that is not being done. http://svnweb.freebsd.org/base/head/lib/libc/stdlib/atexit.c?revision=259042&view=markup Notice that on malloc error, -1 is returned, but errno is not set. >How-To-Repeat: I have not seen it in practice. Memory pressure with an appropriately timed atexit() will result in a -1 return value with an invalid errno set. >Fix: This is a modified diff against our (Apple) atexit.c which is based on your (FreeBSD) atexit.c: Index: atexit.c =================================================================== --- atexit.c (revision 98115) +++ atexit.c (working copy) @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD: src/lib/libc/stdlib/atexit.c,v 1.8 2007/01/09 00:28:09 imp Exp $"); #include "namespace.h" +#include #include #include #include @@ -121,8 +125,10 @@ struct atexit *old__atexit; old__atexit = __atexit; _MUTEX_UNLOCK(&atexit_mutex); - if ((p = (struct atexit *)malloc(sizeof(*p))) == NULL) + if ((p = (struct atexit *)malloc(sizeof(*p))) == NULL) { + errno = ENOMEM; return (-1); + } _MUTEX_LOCK(&atexit_mutex); if (old__atexit != __atexit) { /* Lost race, retry operation */ >Release-Note: >Audit-Trail: >Unformatted: