From owner-p4-projects@FreeBSD.ORG Sat Dec 9 21:01:47 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6852816A417; Sat, 9 Dec 2006 21:01:47 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id F349A16A40F for ; Sat, 9 Dec 2006 21:01:46 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.FreeBSD.org (Postfix) with ESMTP id F243043CBF for ; Sat, 9 Dec 2006 21:00:33 +0000 (GMT) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id kB9L1duQ078129 for ; Sat, 9 Dec 2006 21:01:39 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kB9L1dW1078125 for perforce@freebsd.org; Sat, 9 Dec 2006 21:01:39 GMT (envelope-from piso@freebsd.org) Date: Sat, 9 Dec 2006 21:01:39 GMT Message-Id: <200612092101.kB9L1dW1078125@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to piso@freebsd.org using -f From: Paolo Pisati To: Perforce Change Reviews Cc: Subject: PERFORCE change 111341 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 09 Dec 2006 21:01:47 -0000 http://perforce.freebsd.org/chv.cgi?CH=111341 Change 111341 by piso@piso_newluxor on 2006/12/09 21:01:37 Introduce LibAliasInLocked() & LibAliasOutLocked() for the PKT_ALIAS_REVERSE case: using these functions we avoid a dangerous drop and reacquire of the lock around a call to LibAliasIn*()/LibAliasOut*(). Suggested by: glebius Affected files ... .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#26 edit Differences ... ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#26 (text+ko) ==== @@ -1211,20 +1211,35 @@ LIBALIAS_UNLOCK(la); } +/* Local prototypes */ +static int +LibAliasOutLocked(struct libalias *la, char *ptr, + int maxpacketsize); +static int +LibAliasInLocked(struct libalias *la, char *ptr, + int maxpacketsize); int LibAliasIn(struct libalias *la, char *ptr, int maxpacketsize) { + int res; + + LIBALIAS_LOCK(la); + res = LibAliasInLocked(la, ptr, maxpacketsize); + LIBALIAS_LOCK(la); + return (res); +} + +static int +LibAliasInLocked(struct libalias *la, char *ptr, int maxpacketsize) +{ struct in_addr alias_addr; struct ip *pip; int iresult; - - LIBALIAS_LOCK(la); + if (la->packetAliasMode & PKT_ALIAS_REVERSE) { la->packetAliasMode &= ~PKT_ALIAS_REVERSE; - LIBALIAS_UNLOCK(la); - iresult = LibAliasOut(la, ptr, maxpacketsize); - LIBALIAS_LOCK(la); + iresult = LibAliasOutLocked(la, ptr, maxpacketsize); la->packetAliasMode |= PKT_ALIAS_REVERSE; goto getout; } @@ -1293,7 +1308,6 @@ } getout: - LIBALIAS_UNLOCK(la); return (iresult); } @@ -1314,31 +1328,31 @@ #define UNREG_ADDR_C_UPPER 0xc0a8ffff int -LibAliasOut(struct libalias *la, char *ptr, /* valid IP packet */ - int maxpacketsize /* How much the packet data may grow (FTP - * and IRC inline changes) */ -) +LibAliasOut(struct libalias *la, char *ptr, int maxpacketsize) { - return (LibAliasOutTry(la, ptr, maxpacketsize, 1)); + int res; + + LIBALIAS_LOCK(la); + res = LibAliasOutLocked(la, ptr, maxpacketsize); + LIBALIAS_UNLOCK(la); + return (res); } -int -LibAliasOutTry(struct libalias *la, char *ptr, /* valid IP packet */ - int maxpacketsize, /* How much the packet data may grow (FTP +static int +LibAliasOutLocked(struct libalias *la, char *ptr, /* valid IP packet */ + int maxpacketsize /* How much the packet data may grow (FTP * and IRC inline changes) */ - int create /* Create new entries ? */ ) { int iresult; + int create; /* Create new entries ? */ struct in_addr addr_save; struct ip *pip; - LIBALIAS_LOCK(la); + create = 1; if (la->packetAliasMode & PKT_ALIAS_REVERSE) { la->packetAliasMode &= ~PKT_ALIAS_REVERSE; - LIBALIAS_UNLOCK(la); - iresult = LibAliasIn(la, ptr, maxpacketsize); - LIBALIAS_LOCK(la); + iresult = LibAliasInLocked(la, ptr, maxpacketsize); la->packetAliasMode |= PKT_ALIAS_REVERSE; goto getout; } @@ -1414,7 +1428,6 @@ SetDefaultAliasAddress(la, addr_save); getout: - LIBALIAS_UNLOCK(la); return (iresult); }