PERFORCE change 111341 for review
Paolo Pisati
piso at FreeBSD.org
Sat Dec 9 13:01:47 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=111341
Change 111341 by piso at 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);
}
More information about the p4-projects
mailing list