Merge branch 'fifteen' of ssh://git.ipfire.org/pub/git/ipfire-2.x into firewall-fifteen

This commit is contained in:
Alexander Marx
2013-10-16 14:22:38 +02:00
76 changed files with 10891 additions and 655 deletions

View File

@@ -0,0 +1 @@
srv/web/ipfire/html/include/jquery.js

View File

@@ -0,0 +1 @@
../../../../common/armv5tel/glibc

View File

@@ -8,6 +8,8 @@ srv/web/ipfire/cgi-bin/proxy.cgi
srv/web/ipfire/cgi-bin/upnp.cgi
srv/web/ipfire/cgi-bin/speed.cgi
srv/web/ipfire/cgi-bin/vpnmain.cgi
srv/web/ipfire/html/themes/ipfire/include/functions.pl
srv/web/ipfire/html/themes/maniac/include/functions.pl
var/ipfire/backup/bin/backup.pl
var/ipfire/backup/exclude
var/ipfire/backup/include

View File

@@ -0,0 +1 @@
../../../../common/i586/glibc

View File

@@ -0,0 +1 @@
../../../common/jquery

View File

@@ -42,6 +42,15 @@ done
#Extract files
extract_files
if [ -e "/var/ipfire/proxy/enable" ] || [ -e "/var/ipfire/proxy/enable_blue" ]; then
(
eval $(/usr/local/bin/readhash /var/ipfire/proxy/advanced/settings)
TRANSPARENT_PORT="$(( ${PROXY_PORT} + 1 ))"
echo "TRANSPARENT_PORT=${TRANSPARENT_PORT}" >> /var/ipfire/proxy/advanced/settings
)
fi
# Regenerate squid configuration files.
/srv/web/ipfire/cgi-bin/proxy.cgi

View File

@@ -549,6 +549,8 @@ WARNING: untranslated string: Set time on boot
WARNING: untranslated string: advproxy cache-digest
WARNING: untranslated string: advproxy errmsg cache
WARNING: untranslated string: advproxy errmsg invalid upstream proxy
WARNING: untranslated string: advproxy errmsg proxy ports equal
WARNING: untranslated string: advproxy proxy port transparent
WARNING: untranslated string: age second
WARNING: untranslated string: age seconds
WARNING: untranslated string: age shour

View File

@@ -551,6 +551,8 @@ WARNING: untranslated string: Scan for Songs
WARNING: untranslated string: advproxy cache-digest
WARNING: untranslated string: advproxy errmsg cache
WARNING: untranslated string: advproxy errmsg invalid upstream proxy
WARNING: untranslated string: advproxy errmsg proxy ports equal
WARNING: untranslated string: advproxy proxy port transparent
WARNING: untranslated string: age second
WARNING: untranslated string: age seconds
WARNING: untranslated string: age shour

View File

@@ -552,6 +552,8 @@ WARNING: translation string unused: year-graph
WARNING: translation string unused: yearly firewallhits
WARNING: untranslated string: Scan for Songs
WARNING: untranslated string: advproxy cache-digest
WARNING: untranslated string: advproxy errmsg proxy ports equal
WARNING: untranslated string: advproxy proxy port transparent
WARNING: untranslated string: age second
WARNING: untranslated string: age seconds
WARNING: untranslated string: age shour

View File

@@ -549,6 +549,8 @@ WARNING: untranslated string: Set time on boot
WARNING: untranslated string: advproxy cache-digest
WARNING: untranslated string: advproxy errmsg cache
WARNING: untranslated string: advproxy errmsg invalid upstream proxy
WARNING: untranslated string: advproxy errmsg proxy ports equal
WARNING: untranslated string: advproxy proxy port transparent
WARNING: untranslated string: age second
WARNING: untranslated string: age seconds
WARNING: untranslated string: age shour

View File

@@ -543,6 +543,8 @@ WARNING: untranslated string: Scan for Songs
WARNING: untranslated string: advproxy cache-digest
WARNING: untranslated string: advproxy errmsg cache
WARNING: untranslated string: advproxy errmsg invalid upstream proxy
WARNING: untranslated string: advproxy errmsg proxy ports equal
WARNING: untranslated string: advproxy proxy port transparent
WARNING: untranslated string: age second
WARNING: untranslated string: age seconds
WARNING: untranslated string: age shour

View File

@@ -555,6 +555,8 @@ WARNING: translation string unused: xtaccess bad transfert
WARNING: translation string unused: year-graph
WARNING: translation string unused: yearly firewallhits
WARNING: untranslated string: Scan for Songs
WARNING: untranslated string: advproxy errmsg proxy ports equal
WARNING: untranslated string: advproxy proxy port transparent
WARNING: untranslated string: bytes
WARNING: untranslated string: dnsforward
WARNING: untranslated string: dnsforward add a new entry

View File

@@ -13,6 +13,8 @@
############################################################################
< advproxy errmsg cache
< advproxy errmsg invalid upstream proxy
< advproxy errmsg proxy ports equal
< advproxy proxy port transparent
< age second
< age seconds
< age shour
@@ -414,6 +416,8 @@
############################################################################
< advproxy errmsg cache
< advproxy errmsg invalid upstream proxy
< advproxy errmsg proxy ports equal
< advproxy proxy port transparent
< age second
< age seconds
< age shour
@@ -808,6 +812,8 @@
############################################################################
< advproxy errmsg cache
< advproxy errmsg invalid upstream proxy
< advproxy errmsg proxy ports equal
< advproxy proxy port transparent
< age second
< age seconds
< age shour
@@ -1178,6 +1184,8 @@
< Add a route
< advproxy errmsg cache
< advproxy errmsg invalid upstream proxy
< advproxy errmsg proxy ports equal
< advproxy proxy port transparent
< age second
< age seconds
< age shour

View File

@@ -256,6 +256,7 @@ $checked{'SERVICE'}{'selfhost.de'} = '';
$checked{'SERVICE'}{'strato.com'} = '';
$checked{'SERVICE'}{'tzo.com'} = '';
$checked{'SERVICE'}{'zoneedit.com'} = '';
$checked{'SERVICE'}{'udmedia.de'} = '';
$checked{'SERVICE'}{$settings{'SERVICE'}} = "selected='selected'";
$checked{'BEHINDROUTER'}{'RED_IP'} = '';
@@ -351,6 +352,7 @@ print <<END
<option $checked{'SERVICE'}{'selfhost.de'}>selfhost.de</option>
<option $checked{'SERVICE'}{'strato.com'}>strato.com</option>
<!-- <option $checked{'SERVICE'}{'tzo.com'}>tzo.com</option> comment this service out until a working fix is developed -->
<option $checked{'SERVICE'}{'udmedia.de'}>udmedia.de</option>
<option $checked{'SERVICE'}{'zoneedit.com'}>zoneedit.com</option>
</select></td>
<td width='20%' class='base'>$Lang::tr{'hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>

View File

@@ -195,6 +195,7 @@ $proxysettings{'ENABLE_BLUE'} = 'off';
$proxysettings{'TRANSPARENT'} = 'off';
$proxysettings{'TRANSPARENT_BLUE'} = 'off';
$proxysettings{'PROXY_PORT'} = '800';
$proxysettings{'TRANSPARENT_PORT'} = '3128';
$proxysettings{'VISIBLE_HOSTNAME'} = '';
$proxysettings{'ADMIN_MAIL_ADDRESS'} = '';
$proxysettings{'ADMIN_PASSWORD'} = '';
@@ -212,7 +213,7 @@ $proxysettings{'LOGGING'} = 'off';
$proxysettings{'CACHEMGR'} = 'off';
$proxysettings{'LOGQUERY'} = 'off';
$proxysettings{'LOGUSERAGENT'} = 'off';
$proxysettings{'FILEDESCRIPTORS'} = '4096';
$proxysettings{'FILEDESCRIPTORS'} = '16384';
$proxysettings{'CACHE_MEM'} = '2';
$proxysettings{'CACHE_SIZE'} = '50';
$proxysettings{'MAX_SIZE'} = '4096';
@@ -359,6 +360,15 @@ if (($proxysettings{'ACTION'} eq $Lang::tr{'save'}) || ($proxysettings{'ACTION'}
$errormessage = $Lang::tr{'advproxy errmsg invalid proxy port'};
goto ERROR;
}
if (!(&General::validport($proxysettings{'TRANSPARENT_PORT'})))
{
$errormessage = $Lang::tr{'advproxy errmsg invalid proxy port'};
goto ERROR;
}
if ($proxysettings{'PROXY_PORT'} eq $proxysettings{'TRANSPARENT_PORT'}) {
$errormessage = $Lang::tr{'advproxy errmsg proxy ports equal'};
goto ERROR;
}
if (!($proxysettings{'UPSTREAM_PROXY'} eq ''))
{
my @temp = split(/:/,$proxysettings{'UPSTREAM_PROXY'});
@@ -956,8 +966,8 @@ print <<END
<tr>
<td class='base'>$Lang::tr{'advproxy transparent on'} <font color="$Header::colourgreen">Green</font>:</td>
<td><input type='checkbox' name='TRANSPARENT' $checked{'TRANSPARENT'}{'on'} /></td>
<td class='base'>$Lang::tr{'advproxy visible hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
<td><input type='text' name='VISIBLE_HOSTNAME' value='$proxysettings{'VISIBLE_HOSTNAME'}' /></td>
<td width='25%' class='base'>$Lang::tr{'advproxy proxy port transparent'}:</td>
<td width='30%'><input type='text' name='TRANSPARENT_PORT' value='$proxysettings{'TRANSPARENT_PORT'}' size='5' /></td>
</tr>
<tr>
END
@@ -969,7 +979,8 @@ if ($netsettings{'BLUE_DEV'}) {
print "<td colspan='2'>&nbsp;</td>";
}
print <<END
<td colspan='2'>&nbsp;</td>
<td class='base'>$Lang::tr{'advproxy visible hostname'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
<td><input type='text' name='VISIBLE_HOSTNAME' value='$proxysettings{'VISIBLE_HOSTNAME'}' /></td>
</tr>
<tr>
END
@@ -3078,17 +3089,27 @@ END
}
print FILE "http_port $netsettings{'GREEN_ADDRESS'}:$proxysettings{'PROXY_PORT'}";
if ($proxysettings{'TRANSPARENT'} eq 'on') { print FILE " transparent" }
if ($proxysettings{'NO_CONNECTION_AUTH'} eq 'on') { print FILE " no-connection-auth" }
print FILE "\n";
if ($netsettings{'BLUE_DEV'} && $proxysettings{'ENABLE_BLUE'} eq 'on') {
print FILE "http_port $netsettings{'BLUE_ADDRESS'}:$proxysettings{'PROXY_PORT'}";
if ($proxysettings{'TRANSPARENT_BLUE'} eq 'on') { print FILE " transparent" }
if ($proxysettings{'TRANSPARENT'} eq 'on') {
print FILE "http_port $netsettings{'GREEN_ADDRESS'}:$proxysettings{'TRANSPARENT_PORT'} intercept";
if ($proxysettings{'NO_CONNECTION_AUTH'} eq 'on') { print FILE " no-connection-auth" }
print FILE "\n";
}
if ($netsettings{'BLUE_DEV'} && $proxysettings{'ENABLE_BLUE'} eq 'on') {
print FILE "http_port $netsettings{'BLUE_ADDRESS'}:$proxysettings{'PROXY_PORT'}";
if ($proxysettings{'NO_CONNECTION_AUTH'} eq 'on') { print FILE " no-connection-auth" }
print FILE "\n";
if ($proxysettings{'TRANSPARENT_BLUE'} eq 'on') {
print FILE "http_port $netsettings{'BLUE_ADDRESS'}:$proxysettings{'TRANSPARENT_PORT'} intercept";
if ($proxysettings{'NO_CONNECTION_AUTH'} eq 'on') { print FILE " no-connection-auth" }
print FILE "\n";
}
}
if ($proxysettings{'CACHE_SIZE'} > 0)
{
print FILE "\n";
@@ -3457,7 +3478,7 @@ END
# Check if squidclamav is enabled.
if ($proxysettings{'ENABLE_CLAMAV'} eq 'on') {
print FILE "\n#Settings for squidclamav:\n";
print FILE "http_port 127.0.0.1:$proxysettings{'PROXY_PORT'} transparent\n";
print FILE "http_port 127.0.0.1:$proxysettings{'PROXY_PORT'}\n";
print FILE "acl purge method PURGE\n";
print FILE "http_access deny to_localhost\n";
print FILE "http_access allow localhost\n";

File diff suppressed because one or more lines are too long

View File

@@ -177,7 +177,7 @@ END
;
if ($settings{'SPEED'} ne 'off') {
print <<END
<script type="text/javascript" src="/include/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="/include/jquery.js"></script>
<script type="text/javascript">
var t_current;
var t_last;

View File

@@ -177,7 +177,7 @@ END
;
if ($settings{'SPEED'} ne 'off') {
print <<END
<script type="text/javascript" src="/include/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="/include/jquery.js"></script>
<script type="text/javascript">
var t_current;
var t_last;

View File

@@ -243,6 +243,7 @@
'advproxy errmsg password length 1' => 'Passwort muss mindestens',
'advproxy errmsg password length 2' => ' Zeichen enthalten',
'advproxy errmsg passwords different' => 'Passwörter stimmen nicht überein',
'advproxy errmsg proxy ports equal' => 'Der Proxy-Port darf nicht identisch mit dem transparenten Port sein.',
'advproxy errmsg radius port' => 'Ungültige RADIUS Portnummer',
'advproxy errmsg radius secret' => 'Shared Secret erforderlich',
'advproxy errmsg radius server' => 'Ungültige IP-Adresse für den RADIUS-Server',
@@ -280,6 +281,7 @@
'advproxy on' => 'Proxy an',
'advproxy privacy' => 'Datenschutz',
'advproxy proxy port' => 'Proxy-Port',
'advproxy proxy port transparent' => 'Transparenter Port',
'advproxy ram cache size' => 'Cachegröße im Arbeitsspeicher (MB)',
'advproxy redirector children' => 'Anzahl der Filterprozesse',
'advproxy reset' => 'Zurücksetzen',

View File

@@ -243,6 +243,7 @@
'advproxy errmsg password length 1' => 'Password must have at least ',
'advproxy errmsg password length 2' => ' characters',
'advproxy errmsg passwords different' => 'Passwords don\'t match',
'advproxy errmsg proxy ports equal' => 'The proxy port and the transparent port cannot be equal.',
'advproxy errmsg radius port' => 'Invalid RADIUS port number',
'advproxy errmsg radius secret' => 'RADIUS shared secret required',
'advproxy errmsg radius server' => 'Invalid IP address for RADIUS Server',
@@ -280,6 +281,7 @@
'advproxy on' => 'Proxy on',
'advproxy privacy' => 'Privacy',
'advproxy proxy port' => 'Proxy port',
'advproxy proxy port transparent' => 'Transparent port',
'advproxy ram cache size' => 'Memory cache size (MB)',
'advproxy redirector children' => 'Number of filter processes',
'advproxy reset' => 'Reset',

View File

@@ -98,6 +98,9 @@ ifeq "$(PASS)" "C"
chmod -R 755 /srv/web/ipfire/cgi-bin
chmod -R 644 /srv/web/ipfire/html
chmod 755 /srv/web/ipfire/html /srv/web/ipfire/html/{index.cgi,redirect.cgi,dial.cgi,images,include,themes,themes/*,themes/*/*}
# Reset permissions of redirect templates directories
find /srv/web/ipfire/html/redirect-templates -type d | xargs chmod -v 755
else
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
cd $(DIR_APP) && patch -Np1 -i $(DIR_DL)/httpd-2.2.2-config-1.patch

View File

@@ -227,13 +227,37 @@ endif
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh795498.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh797094-1.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh797094-2.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh804630.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh804686.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh804689.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh806404.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh808337.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh808545.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh809602.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh833716.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh837026.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh809726.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh823909.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh826149.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh827362.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh830127.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh832516.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh832694.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh833717.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh837695.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh837918.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh841787.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh843673.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh846342.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh847932.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh848082.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh849203.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh849651.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh852445.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh861167.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh863453.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh864322.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh929388.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh970992.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh989558.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc/glibc-rh989558-2.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc-resolv-stack_chk_fail.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc-remove-ctors-dtors-output-sections.patch

76
lfs/jquery Normal file
View File

@@ -0,0 +1,76 @@
###############################################################################
# #
# IPFire.org - A linux based firewall #
# Copyright (C) 2007-2013 IPFire Team <info@ipfire.org> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
###############################################################################
###############################################################################
# Definitions
###############################################################################
include Config
VER = 1.10.2
THISAPP = jquery-$(VER)
DL_FILE = $(THISAPP).min.js
DL_FROM = $(URL_IPFIRE)
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
###############################################################################
# Top-level Rules
###############################################################################
objects = $(DL_FILE)
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
$(DL_FILE)_MD5 = 628072e7212db1e8cdacb22b21752cda
install : $(TARGET)
check : $(patsubst %,$(DIR_CHK)/%,$(objects))
download :$(patsubst %,$(DIR_DL)/%,$(objects))
md5 : $(subst %,%_MD5,$(objects))
###############################################################################
# Downloading, checking, md5sum
###############################################################################
$(patsubst %,$(DIR_CHK)/%,$(objects)) :
@$(CHECK)
$(patsubst %,$(DIR_DL)/%,$(objects)) :
@$(LOAD)
$(subst %,%_MD5,$(objects)) :
@$(MD5)
###############################################################################
# Installation Details
###############################################################################
$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
-mkdir -pv /srv/web/ipfire/html/include
install -v -m 644 $(DIR_DL)/$(DL_FILE) /srv/web/ipfire/html/include/jquery.js
@$(POSTBUILD)

View File

@@ -24,10 +24,10 @@
include Config
VER = 3.10.15
VER = 3.10.16
RPI_PATCHES = linux-3.10.10-c1af7c6
GRS_PATCHES = grsecurity-2.9.1-3.10.15-ipfire1.patch.xz
GRS_PATCHES = grsecurity-2.9.1-3.10.16-ipfire1.patch.xz
THISAPP = linux-$(VER)
DL_FILE = linux-$(VER).tar.xz
@@ -74,9 +74,9 @@ $(DL_FILE) = $(URL_IPFIRE)/$(DL_FILE)
rpi-patches-$(RPI_PATCHES).patch.xz = $(URL_IPFIRE)/rpi-patches-$(RPI_PATCHES).patch.xz
$(GRS_PATCHES) = $(URL_IPFIRE)/$(GRS_PATCHES)
$(DL_FILE)_MD5 = 3fe22263308674d92c6d106f633eca52
$(DL_FILE)_MD5 = 5e232365cbc0797b716b605a165703e1
rpi-patches-$(RPI_PATCHES).patch.xz_MD5 = ef9274b3ff5d05daaaa4bdbe86ad00fc
$(GRS_PATCHES)_MD5 = a9a6c5009cef39cfb798da1466044e33
$(GRS_PATCHES)_MD5 = 826d8a90e7cdfc84ac871512c773d712
install : $(TARGET)
@@ -191,21 +191,21 @@ else
cd $(DIR_APP) && sed -i -e 's/EXTRAVERSION\ =.*/EXTRAVERSION\ =\ -$(VERSUFIX)/' Makefile
ifeq "$(KCFG)" "-kirkwood"
cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" uImage
cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" uImage modules
cd $(DIR_APP) && cp -v arch/arm/boot/uImage /boot/vmlinuz-$(VER)-$(VERSUFIX)
cd $(DIR_APP) && cp -v arch/arm/boot/uImage /boot/uImage-$(VERSUFIX)
else
ifeq "$(KCFG)" "-multi"
cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" zImage
cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" zImage modules
cd $(DIR_APP) && cp -v arch/arm/boot/zImage /boot/vmlinuz-$(VER)-$(VERSUFIX)
cd $(DIR_APP) && cp -v arch/arm/boot/zImage /boot/zImage-$(VERSUFIX)
else
ifeq "$(KCFG)" "-rpi"
cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" zImage
cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" zImage modules
cd $(DIR_APP) && cp -v arch/arm/boot/zImage /boot/vmlinuz-$(VER)-$(VERSUFIX)
cd $(DIR_APP) && cp -v arch/arm/boot/zImage /boot/kernel.img
else
cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" bzImage
cd $(DIR_APP) && make $(MAKETUNING) CC="$(KGCC)" bzImage modules
cd $(DIR_APP) && cp -v arch/i386/boot/bzImage /boot/vmlinuz-$(VER)-$(VERSUFIX)
ln -sf vmlinuz-$(VER)-$(VERSUFIX) /boot/vmlinuz-$(VERSUFIX)
endif
@@ -214,7 +214,6 @@ endif
cd $(DIR_APP) && cp -v System.map /boot/System.map-$(VER)-$(VERSUFIX)
cd $(DIR_APP) && cp -v .config /boot/config-$(VER)-$(VERSUFIX)
ln -sf System.map-$(VER)-$(VERSUFIX) /boot/System.map-$(VERSUFIX)
cd $(DIR_APP) && make CC="$(KGCC)" $(MAKETUNING) modules
cd $(DIR_APP) && make CC="$(KGCC)" $(MAKETUNING) modules_install
cd $(DIR_APP) && make CC="$(KGCC)" $(MAKETUNING) firmware_install

View File

@@ -24,7 +24,7 @@
include Config
VER = 3.3.8
VER = 3.3.9
THISAPP = squid-$(VER)
DL_FILE = $(THISAPP).tar.xz
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
$(DL_FILE)_MD5 = 6a8fa0075f2fbdd899ac4c9d95fe67cb
$(DL_FILE)_MD5 = 6c4ba0d63c3a6d94de2da689f361cdab
install : $(TARGET)
@@ -114,7 +114,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
--enable-cache-digests \
--enable-forw-via-db \
--enable-htcp \
--enable-ipf-transparent \
--enable-linux-netfilter \
--enable-kill-parent-hack \
--disable-wccpv2 \
--enable-icap-client \

View File

@@ -493,6 +493,7 @@ buildipfire() {
ipfiremake apache2
ipfiremake php
ipfiremake apache2 PASS=C
ipfiremake jquery
ipfiremake arping
ipfiremake beep
ipfiremake dvdrtools

View File

@@ -15,8 +15,8 @@ transparent() {
eval $(/usr/local/bin/readhash /var/ipfire/proxy/settings)
# If the proxy port is not set we set the default to 800.
if [ -z $PROXY_PORT ]; then
PROXY_PORT=800
if [ -z "${TRANSPARENT_PORT}" ]; then
TRANSPARENT_PORT=800
fi
LOCALIP=`cat /var/ipfire/red/local-ipaddress | tr -d \n`
@@ -43,7 +43,7 @@ transparent() {
iptables -t nat -A SQUID -i $1 -p tcp -d $LOCALIP --dport 80 -j RETURN
iptables -t nat -A SQUID -i $1 -p tcp --dport 80 -j REDIRECT --to-port $PROXY_PORT
iptables -t nat -A SQUID -i $1 -p tcp --dport 80 -j REDIRECT --to-port "${TRANSPARENT_PORT}"
}
case "$1" in

View File

@@ -35,7 +35,7 @@
#include "langs.h"
#define STRING_SIZE 1023
#define STRING_SIZE 1024
#define ADDRESS 0
#define NETADDRESS 1

View File

@@ -15,31 +15,30 @@
int main(int argc, char *argv[]) {
int i;
char command[1024];
char add[STRING_SIZE];
char command[STRING_SIZE] = "/var/ipfire/backup/bin/backup.pl";
char temp[STRING_SIZE];
if (!(initsetuid()))
exit(1);
snprintf(command, STRING_SIZE, "/var/ipfire/backup/bin/backup.pl");
for (i = 1; i < argc; i++) {
if (strstr(argv[i], "&&")){
fprintf (stderr, "Bad Argument!\n");
exit (1);
}
else if (strstr(argv[i], "|")){
fprintf (stderr, "Bad Argument!\n");
exit (1);
if (strstr(argv[i], "&&")){
fprintf (stderr, "Bad Argument!\n");
exit (1);
} else if (strstr(argv[i], "|")) {
fprintf (stderr, "Bad Argument!\n");
exit (1);
} else if (argc > 3) {
fprintf (stderr, "Too Many Arguments!\n");
exit (1);
} else {
snprintf(temp, STRING_SIZE, "%s %s", command, argv[i]);
snprintf(command, STRING_SIZE, "%s", temp);
}
else if (argc > 3){
fprintf (stderr, "Too Many Arguments!\n");
exit (1);
}
else{
sprintf(add, " %s", argv[i]);
strcat(command, add);
}
}
return safe_system(command);
}

View File

@@ -1,23 +1,23 @@
/* IPFire helper program - fireinfoctrl
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* (c) IPFire Team, 2011
*
* Simple program that calls "sendprofile" as the root user.
*
*/
#include <stdlib.h>
#include "setuid.h"
int main(void)
{
if (!(initsetuid()))
exit(1);
safe_system("/usr/bin/sendprofile");
return 0;
}
/* IPFire helper program - fireinfoctrl
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* (c) IPFire Team, 2011
*
* Simple program that calls "sendprofile" as the root user.
*
*/
#include <stdlib.h>
#include "setuid.h"
int main(void)
{
if (!(initsetuid()))
exit(1);
safe_system("/usr/bin/sendprofile");
return 0;
}

View File

@@ -1,31 +1,31 @@
/* IPFire helper program - getconntracktable
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* The kernel's connection tracking table is not readable by
* non-root users. So this helper will just read and output it.
*/
#include <stdio.h>
#include <stdlib.h>
#include "setuid.h"
int main(void) {
if (!(initsetuid()))
exit(1);
FILE *fp = fopen("/proc/net/nf_conntrack", "r");
if (fp == NULL) {
exit(1);
}
/* Read content line by line and write it to stdout. */
char linebuf[STRING_SIZE];
while (fgets(linebuf, STRING_SIZE, fp)) {
printf("%s", linebuf);
}
fclose(fp);
return 0;
}
/* IPFire helper program - getconntracktable
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* The kernel's connection tracking table is not readable by
* non-root users. So this helper will just read and output it.
*/
#include <stdio.h>
#include <stdlib.h>
#include "setuid.h"
int main(void) {
if (!(initsetuid()))
exit(1);
FILE *fp = fopen("/proc/net/nf_conntrack", "r");
if (fp == NULL) {
exit(1);
}
/* Read content line by line and write it to stdout. */
char linebuf[STRING_SIZE];
while (fgets(linebuf, STRING_SIZE, fp)) {
printf("%s", linebuf);
}
fclose(fp);
return 0;
}

View File

@@ -1,44 +1,44 @@
/* SmoothWall helper program - iowrap.
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* (c) Lawrence Manning, 2001
* Installer helper for redirecting stdout/stderr to a file/terminal.
* init calls ash through this program to shove it on a tty.
*
* $Id: iowrap.c,v 1.2 2001/11/27 15:20:50 riddles Exp $
*
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
/* Prog takes one argument. A device to run on (like a getty) */
if (argc >= 2)
{
int fd;
if ((fd = open(argv[1], O_RDWR)) == -1)
{
printf("Couldn't open device\n");
return 0;
}
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
/* Now its sending/reading on that device. */
}
if (argc >= 3)
execvp(argv[2], &argv[2]);
else
printf("No command\n");
return 0;
}
/* SmoothWall helper program - iowrap.
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* (c) Lawrence Manning, 2001
* Installer helper for redirecting stdout/stderr to a file/terminal.
* init calls ash through this program to shove it on a tty.
*
* $Id: iowrap.c,v 1.2 2001/11/27 15:20:50 riddles Exp $
*
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
/* Prog takes one argument. A device to run on (like a getty) */
if (argc >= 2)
{
int fd;
if ((fd = open(argv[1], O_RDWR)) == -1)
{
printf("Couldn't open device\n");
return 0;
}
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
/* Now its sending/reading on that device. */
}
if (argc >= 3)
execvp(argv[2], &argv[2]);
else
printf("No command\n");
return 0;
}

View File

@@ -1,25 +1,25 @@
/* SmoothWall helper program - smoothiedeath
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* (c) Lawrence Manning, 2001
* Simple program intended to be installed setuid(0) that can be used for
* starting shutdown.
*
* $Id: ipcopdeath.c,v 1.2 2003/12/11 10:57:34 riddles Exp $
*
*/
#include <stdlib.h>
#include "setuid.h"
int main(void)
{
if (!(initsetuid()))
exit(1);
safe_system("/sbin/shutdown -h now");
return 0;
}
/* SmoothWall helper program - smoothiedeath
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* (c) Lawrence Manning, 2001
* Simple program intended to be installed setuid(0) that can be used for
* starting shutdown.
*
* $Id: ipcopdeath.c,v 1.2 2003/12/11 10:57:34 riddles Exp $
*
*/
#include <stdlib.h>
#include "setuid.h"
int main(void)
{
if (!(initsetuid()))
exit(1);
safe_system("/sbin/shutdown -h now");
return 0;
}

View File

@@ -1,25 +1,25 @@
/* SmoothWall helper program - smoothierebirth
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* (c) Lawrence Manning, 2001
* Simple program intended to be installed setuid(0) that can be used for
* starting reboot.
*
* $Id: ipcoprebirth.c,v 1.2 2003/12/11 10:57:34 riddles Exp $
*
*/
#include <stdlib.h>
#include "setuid.h"
int main(void)
{
if (!(initsetuid()))
exit(1);
safe_system("/sbin/shutdown -r now");
return 0;
}
/* SmoothWall helper program - smoothierebirth
*
* This program is distributed under the terms of the GNU General Public
* Licence. See the file COPYING for details.
*
* (c) Lawrence Manning, 2001
* Simple program intended to be installed setuid(0) that can be used for
* starting reboot.
*
* $Id: ipcoprebirth.c,v 1.2 2003/12/11 10:57:34 riddles Exp $
*
*/
#include <stdlib.h>
#include "setuid.h"
int main(void)
{
if (!(initsetuid()))
exit(1);
safe_system("/sbin/shutdown -r now");
return 0;
}

View File

@@ -1,117 +1,117 @@
/*
* This file is part of the IPCop Firewall.
*
* IPCop is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* IPCop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with IPCop; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Copyright (C) 2005-10-25 Franck Bourdonnec
*
* $Id: ipcopreboot.c,v 1.1.2.2 2005/10/24 23:05:50 franck78 Exp $
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "setuid.h"
/* define operations */
#define OP_REBOOT "boot"
#define OP_REBOOT_FS "bootfs" // add filesystem check option (not yet in GUI)
#define OP_SHUTDOWN "down"
#define OP_SCHEDULE_ADD "cron+"
#define OP_SCHEDULE_REM "cron-"
#define OP_SCHEDULE_GET "cron?"
int main(int argc, char**argv)
{
if (!(initsetuid()))
return 1;
// Check what command is asked
if (argc==1)
{
fprintf (stderr, "Missing reboot command!\n");
return 1;
}
if (argc==2 && strcmp(argv[1], OP_SHUTDOWN)==0)
{
safe_system("/sbin/shutdown -h now");
return 0;
}
if (argc==2 && strcmp(argv[1], OP_REBOOT)==0)
{
safe_system("/sbin/shutdown -r now");
return 0;
}
if (argc==2 && strcmp(argv[1], OP_REBOOT_FS)==0)
{
safe_system("/sbin/shutdown -F -r now");
return 0;
}
// output schedule to stdout
if (argc==2 && strcmp(argv[1], OP_SCHEDULE_GET)==0)
{
safe_system("/bin/grep /sbin/shutdown /var/spool/cron/root.orig");
return 0;
}
if (argc==2 && strcmp(argv[1], OP_SCHEDULE_REM)==0)
{
safe_system("/usr/bin/perl -i -p -e 's/^.*\\/sbin\\/shutdown.*$//s' /var/spool/cron/root.orig");
safe_system("/usr/bin/fcrontab -u root -z");
return 0;
}
if (argc==6 && strcmp(argv[1], OP_SCHEDULE_ADD)==0)
{
// check args
if (!( strlen(argv[2])<3 &&
strspn(argv[2], "0123456789") == strlen (argv[2]) &&
strlen(argv[3])<3 &&
strspn(argv[3], "0123456789") == strlen (argv[3]) &&
strlen(argv[4])<14 &&
strspn(argv[4], "1234567,*") == strlen (argv[4]) &&
((strcmp(argv[5], "-r")==0) || //reboot
(strcmp(argv[5], "-h")==0)) ) //hangup
) {
fprintf (stderr, "Bad cron+ parameters!\n");
return 1;
}
// remove old entry
safe_system("/usr/bin/perl -i -p -e 's/^.*\\/sbin\\/shutdown.*$//s' /var/spool/cron/root.orig");
// add new entry
FILE *fd = NULL;
if ((fd = fopen("/var/spool/cron/root.orig", "a")))
{
fprintf (fd,"%s %s * * %s /sbin/shutdown %s 1\n",argv[2],argv[3],argv[4],argv[5]);
fclose (fd);
}
// inform cron
safe_system("/usr/bin/fcrontab -u root -z");
return 0;
}
fprintf (stderr, "Bad reboot command!\n");
return 1;
}
/*
* This file is part of the IPCop Firewall.
*
* IPCop is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* IPCop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with IPCop; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Copyright (C) 2005-10-25 Franck Bourdonnec
*
* $Id: ipcopreboot.c,v 1.1.2.2 2005/10/24 23:05:50 franck78 Exp $
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "setuid.h"
/* define operations */
#define OP_REBOOT "boot"
#define OP_REBOOT_FS "bootfs" // add filesystem check option (not yet in GUI)
#define OP_SHUTDOWN "down"
#define OP_SCHEDULE_ADD "cron+"
#define OP_SCHEDULE_REM "cron-"
#define OP_SCHEDULE_GET "cron?"
int main(int argc, char**argv)
{
if (!(initsetuid()))
return 1;
// Check what command is asked
if (argc==1)
{
fprintf (stderr, "Missing reboot command!\n");
return 1;
}
if (argc==2 && strcmp(argv[1], OP_SHUTDOWN)==0)
{
safe_system("/sbin/shutdown -h now");
return 0;
}
if (argc==2 && strcmp(argv[1], OP_REBOOT)==0)
{
safe_system("/sbin/shutdown -r now");
return 0;
}
if (argc==2 && strcmp(argv[1], OP_REBOOT_FS)==0)
{
safe_system("/sbin/shutdown -F -r now");
return 0;
}
// output schedule to stdout
if (argc==2 && strcmp(argv[1], OP_SCHEDULE_GET)==0)
{
safe_system("/bin/grep /sbin/shutdown /var/spool/cron/root.orig");
return 0;
}
if (argc==2 && strcmp(argv[1], OP_SCHEDULE_REM)==0)
{
safe_system("/usr/bin/perl -i -p -e 's/^.*\\/sbin\\/shutdown.*$//s' /var/spool/cron/root.orig");
safe_system("/usr/bin/fcrontab -u root -z");
return 0;
}
if (argc==6 && strcmp(argv[1], OP_SCHEDULE_ADD)==0)
{
// check args
if (!( strlen(argv[2])<3 &&
strspn(argv[2], "0123456789") == strlen (argv[2]) &&
strlen(argv[3])<3 &&
strspn(argv[3], "0123456789") == strlen (argv[3]) &&
strlen(argv[4])<14 &&
strspn(argv[4], "1234567,*") == strlen (argv[4]) &&
((strcmp(argv[5], "-r")==0) || //reboot
(strcmp(argv[5], "-h")==0)) ) //hangup
) {
fprintf (stderr, "Bad cron+ parameters!\n");
return 1;
}
// remove old entry
safe_system("/usr/bin/perl -i -p -e 's/^.*\\/sbin\\/shutdown.*$//s' /var/spool/cron/root.orig");
// add new entry
FILE *fd = NULL;
if ((fd = fopen("/var/spool/cron/root.orig", "a")))
{
fprintf (fd,"%s %s * * %s /sbin/shutdown %s 1\n",argv[2],argv[3],argv[4],argv[5]);
fclose (fd);
}
// inform cron
safe_system("/usr/bin/fcrontab -u root -z");
return 0;
}
fprintf (stderr, "Bad reboot command!\n");
return 1;
}

View File

@@ -13,7 +13,9 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include "setuid.h"
#include "netutil.h"
/*
This module is responsible for start stop of the vpn system.

48
src/misc-progs/netutil.h Normal file
View File

@@ -0,0 +1,48 @@
#ifndef NETUTIL_H
#define NETUTIL_H 1
#include <stdlib.h>
#define LETTERS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
#define NUMBERS "0123456789"
#define LETTERS_NUMBERS LETTERS NUMBERS
#define IP_NUMBERS "./" NUMBERS
#define PORT_NUMBERS ":-" NUMBERS
#define VALID_FQDN LETTERS_NUMBERS ".-"
#define VALID_IP(ip) (strlen(ip) > 6 \
&& strlen(ip) < 16 \
&& strspn(ip, NUMBERS ".") == strlen(ip))
#define VALID_IP_AND_MASK(ip) (strlen(ip) > 6 \
&& strlen(ip) < 32 \
&& strspn(ip, IP_NUMBERS) == strlen(ip))
#define VALID_PORT(port) (strlen(port) \
&& strlen(port) < 6 \
&& strspn(port, NUMBERS) == strlen(port))
#define VALID_PORT_RANGE(port) (strlen(port) \
&& strlen(port) < 12 \
&& strspn(port, PORT_NUMBERS) == strlen(port))
#define VALID_SHORT_MASK(ip) (strlen(ip) > 1 \
&& strlen(ip) < 3 \
&& strspn(ip, NUMBERS) == strlen(ip))
/* Can't find any info on valid characters/length hopefully these are
* reasonable guesses */
#define VALID_DEVICE(dev) (strlen(dev) \
&& strlen(dev) < 16 \
&& strspn(dev, LETTERS_NUMBERS ":.") == strlen(dev))
/* Again, can't find any hard and fast rules for protocol names, these
* restrictions are based on the keywords currently listed in
* <http://www.iana.org/assignments/protocol-numbers>
* though currently the ipcop cgis will only pass tcp, udp or gre anyway */
#define VALID_PROTOCOL(prot) (strlen(prot) \
&& strlen(prot) <16 \
&& strspn(prot, LETTERS_NUMBERS "-") == strlen(prot))
#endif

View File

@@ -8,6 +8,7 @@
#include <netinet/in.h>
#include <fcntl.h>
#include "setuid.h"
#include "netutil.h"
#include "libsmooth.h"
#define noovpndebug

View File

@@ -15,18 +15,16 @@
int main(int argc, char *argv[]) {
int i;
char command[1024];
char add[STRING_SIZE];
char command[STRING_SIZE] = "/opt/pakfire/pakfire";
char temp[STRING_SIZE];
if (!(initsetuid()))
exit(1);
snprintf(command, STRING_SIZE, "/opt/pakfire/pakfire");
for (i = 1; i < argc; i++) {
sprintf(add, " %s", argv[i]);
strcat(command, add);
snprintf(temp, STRING_SIZE, "%s %s", command, argv[i]);
snprintf(command, STRING_SIZE, "%s", temp);
}
return safe_system(command);
}

View File

@@ -19,7 +19,9 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include "setuid.h"
#include "netutil.h"
FILE *fd = NULL;
FILE *hosts = NULL;

View File

@@ -13,8 +13,6 @@
*
*/
#include "libsmooth.h"
#include "setuid.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -23,6 +21,10 @@
#include <sys/stat.h>
#include <fcntl.h>
#include "libsmooth.h"
#include "setuid.h"
#include "netutil.h"
struct keyvalue *kv = NULL;
FILE *file = NULL;

View File

@@ -1,204 +1,169 @@
/* This file is part of the IPCop Firewall.
*
* IPCop is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* IPCop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with IPCop; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Copyright (C) 2003-04-22 Robert Kerr <rkerr@go.to>
*
* $Id: setuid.c,v 1.2.2.1 2005/11/18 14:51:43 franck78 Exp $
*
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <limits.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <grp.h>
#include <signal.h>
#include <sys/wait.h>
#include <glob.h>
#include "setuid.h"
#ifndef OPEN_MAX
#define OPEN_MAX 256
#endif
/* Trusted environment for executing commands */
char * trusted_env[4]={
"PATH=/usr/bin:/usr/sbin:/sbin:/bin",
"SHELL=/bin/sh",
"TERM=dumb",
NULL};
/* Spawns a child process that uses /bin/sh to interpret a command.
* This is much the same in use and purpose as system(), yet as it uses execve
* to pass a trusted environment it's immune to attacks based upon changing
* IFS, ENV, BASH_ENV and other such variables.
* Note this does NOT guard against any other attacks, inparticular you MUST
* validate the command you are passing. If the command is formed from user
* input be sure to check this input is what you expect. Nasty things can
* happen if a user can inject ; or `` into your command for example */
int safe_system(char* command)
{
return system_core( command, 0, 0, "safe_system" );
}
/* Much like safe_system but lets you specify a non-root uid and gid to run
* the command as */
int unpriv_system(char* command, uid_t uid, gid_t gid)
{
return system_core(command, uid, gid, "unpriv_system" );
}
int system_core(char* command, uid_t uid, gid_t gid, char *error)
{
int pid, status;
if(!command)
return 1;
switch( pid = fork() )
{
case -1:
return -1;
case 0: /* child */
{
char * argv[4];
if (gid && setgid(gid))
{
fprintf(stderr, "%s: ", error);
perror("Couldn't setgid");
exit(127);
}
if (uid && setuid(uid))
{
fprintf(stderr, "%s: ", error);
perror("Couldn't setuid");
exit(127);
}
argv[0] = "sh";
argv[1] = "-c";
argv[2] = command;
argv[3] = NULL;
execve("/bin/sh", argv, trusted_env);
fprintf(stderr, "%s: ", error);
perror("execve failed");
exit(127);
}
default: /* parent */
do {
if( waitpid(pid, &status, 0) == -1 ) {
if( errno != EINTR )
return -1;
} else
return status;
} while (1);
}
}
/* BSD style safe strcat; from the secure programming cookbook */
size_t strlcat(char *dst, const char *src, size_t len) {
char *dstptr = dst;
size_t dstlen, tocopy = len;
const char *srcptr = src;
while (tocopy-- && *dstptr) dstptr++;
dstlen = dstptr - dst;
if (!(tocopy = len - dstlen)) return (dstlen + strlen(src));
while (*srcptr) {
if (tocopy != 1) {
*dstptr++ = *srcptr;
tocopy--;
}
srcptr++;
}
*dstptr = 0;
return (dstlen + (srcptr - src));
}
/* General routine to initialise a setuid root program, and put the
* environment in a known state. Returns 1 on success, if initsetuid() returns
* 0 then you should exit(1) immediately, DON'T attempt to recover from the
* error */
int initsetuid(void)
{
int fds,i;
struct stat st;
struct rlimit rlim;
/* Prevent signal tricks by ignoring all except SIGKILL and SIGCHILD */
for( i = 0; i < NSIG; i++ ) {
if( i != SIGKILL && i != SIGCHLD )
signal(i, SIG_IGN);
}
/* dump all non-standard file descriptors (a full descriptor table could
* lead to DoS by preventing us opening files) */
if ((fds = getdtablesize()) == -1) fds = OPEN_MAX;
for( i = 3; i < fds; i++ ) close(i);
/* check stdin, stdout & stderr are open before going any further */
for( i = 0; i < 3; i++ )
if( fstat(i, &st) == -1 && ((errno != EBADF) || (close(i), open("/dev/null", O_RDWR, 0)) != i ))
return 0;
/* disable core dumps in case we're processing sensitive information */
rlim.rlim_cur = rlim.rlim_max = 0;
if(setrlimit(RLIMIT_CORE, &rlim))
{ perror("Couldn't disable core dumps"); return 0; }
/* drop any supplementary groups, set uid & gid to root */
if (setgroups(0, NULL)) { perror("Couldn't clear group list"); return 0; }
if (setgid(0)) { perror("Couldn't setgid(0)"); return 0; }
if (setuid(0)) { perror("Couldn't setuid(0)"); return 0; }
return 1;
}
/* check whether a file exists */
int file_exists(const char *fname) {
struct stat st;
stat(fname, &st);
return S_ISREG(st.st_mode) ? 1 : 0;
}
/* check whether a file exists. fname is wildcard eg: file_exists (/tmp/foo*) */
int file_exists_w(const char *fname)
{
/* do a quick check first */
struct stat st;
stat(fname, &st);
if (S_ISREG(st.st_mode))
return 1;
/* check for possible wild cards in name */
glob_t globbuf;
int retval=0;
if (glob(fname, GLOB_ERR, NULL, &globbuf)==0) {
if (globbuf.gl_pathc>0) {
retval=1;
}
}
globfree(&globbuf);
return retval;
}
/* This file is part of the IPCop Firewall.
*
* IPCop is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* IPCop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with IPCop; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Copyright (C) 2003-04-22 Robert Kerr <rkerr@go.to>
*
* $Id: setuid.c,v 1.2.2.1 2005/11/18 14:51:43 franck78 Exp $
*
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <limits.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <grp.h>
#include <signal.h>
#include <sys/wait.h>
#include <glob.h>
#include "setuid.h"
#ifndef OPEN_MAX
#define OPEN_MAX 256
#endif
/* Trusted environment for executing commands */
char * trusted_env[4] = {
"PATH=/usr/bin:/usr/sbin:/sbin:/bin",
"SHELL=/bin/sh",
"TERM=dumb",
NULL
};
/* Spawns a child process that uses /bin/sh to interpret a command.
* This is much the same in use and purpose as system(), yet as it uses execve
* to pass a trusted environment it's immune to attacks based upon changing
* IFS, ENV, BASH_ENV and other such variables.
* Note this does NOT guard against any other attacks, inparticular you MUST
* validate the command you are passing. If the command is formed from user
* input be sure to check this input is what you expect. Nasty things can
* happen if a user can inject ; or `` into your command for example */
int safe_system(char* command) {
return system_core(command, 0, 0, "safe_system");
}
/* Much like safe_system but lets you specify a non-root uid and gid to run
* the command as */
int unpriv_system(char* command, uid_t uid, gid_t gid) {
return system_core(command, uid, gid, "unpriv_system");
}
int system_core(char* command, uid_t uid, gid_t gid, char *error) {
int pid, status;
if(!command)
return 1;
switch(pid = fork()) {
case -1:
return -1;
case 0: /* child */ {
char *argv[4];
if (gid && setgid(gid)) {
fprintf(stderr, "%s: ", error);
perror("Couldn't setgid");
exit(127);
}
if (uid && setuid(uid)) {
fprintf(stderr, "%s: ", error);
perror("Couldn't setuid");
exit(127);
}
argv[0] = "sh";
argv[1] = "-c";
argv[2] = command;
argv[3] = NULL;
execve("/bin/sh", argv, trusted_env);
fprintf(stderr, "%s: ", error);
perror("execve failed");
exit(127);
}
default: /* parent */
do {
if (waitpid(pid, &status, 0) == -1) {
if (errno != EINTR)
return -1;
} else {
return status;
}
} while (1);
}
}
/* General routine to initialise a setuid root program, and put the
* environment in a known state. Returns 1 on success, if initsetuid() returns
* 0 then you should exit(1) immediately, DON'T attempt to recover from the
* error */
int initsetuid(void) {
int fds, i;
struct stat st;
struct rlimit rlim;
/* Prevent signal tricks by ignoring all except SIGKILL and SIGCHILD */
for (i = 0; i < NSIG; i++) {
if (i != SIGKILL && i != SIGCHLD)
signal(i, SIG_IGN);
}
/* dump all non-standard file descriptors (a full descriptor table could
* lead to DoS by preventing us opening files) */
if ((fds = getdtablesize()) == -1)
fds = OPEN_MAX;
for (i = 3; i < fds; i++)
close(i);
/* check stdin, stdout & stderr are open before going any further */
for (i = 0; i < 3; i++)
if( fstat(i, &st) == -1 && ((errno != EBADF) || (close(i), open("/dev/null", O_RDWR, 0)) != i))
return 0;
/* disable core dumps in case we're processing sensitive information */
rlim.rlim_cur = rlim.rlim_max = 0;
if (setrlimit(RLIMIT_CORE, &rlim)) {
perror("Couldn't disable core dumps");
return 0;
}
/* drop any supplementary groups, set uid & gid to root */
if (setgroups(0, NULL)) {
perror("Couldn't clear group list");
return 0;
}
if (setgid(0)) {
perror("Couldn't setgid(0)");
return 0;
}
if (setuid(0)) {
perror("Couldn't setuid(0)");
return 0;
}
return 1;
}

View File

@@ -15,60 +15,18 @@
/* As nothing in setuid.c uses STRING_SIZE specifically there's no real reason
* to redefine it if it already is set */
#ifndef STRING_SIZE
#define STRING_SIZE 256
#define STRING_SIZE 1024
#endif
#define LETTERS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
#define NUMBERS "0123456789"
#define LETTERS_NUMBERS LETTERS NUMBERS
#define IP_NUMBERS "./" NUMBERS
#define PORT_NUMBERS ":-" NUMBERS
#define VALID_FQDN LETTERS_NUMBERS ".-"
#define VALID_IP(ip) (strlen(ip) > 6 \
&& strlen(ip) < 16 \
&& strspn(ip, NUMBERS ".") == strlen(ip))
#define VALID_IP_AND_MASK(ip) (strlen(ip) > 6 \
&& strlen(ip) < 32 \
&& strspn(ip, IP_NUMBERS) == strlen(ip))
#define VALID_PORT(port) (strlen(port) \
&& strlen(port) < 6 \
&& strspn(port, NUMBERS) == strlen(port))
#define VALID_PORT_RANGE(port) (strlen(port) \
&& strlen(port) < 12 \
&& strspn(port, PORT_NUMBERS) == strlen(port))
#define VALID_SHORT_MASK(ip) (strlen(ip) > 1 \
&& strlen(ip) < 3 \
&& strspn(ip, NUMBERS) == strlen(ip))
/* Can't find any info on valid characters/length hopefully these are
* reasonable guesses */
#define VALID_DEVICE(dev) (strlen(dev) \
&& strlen(dev) < 16 \
&& strspn(dev, LETTERS_NUMBERS ":.") == strlen(dev))
/* Again, can't find any hard and fast rules for protocol names, these
* restrictions are based on the keywords currently listed in
* <http://www.iana.org/assignments/protocol-numbers>
* though currently the ipcop cgis will only pass tcp, udp or gre anyway */
#define VALID_PROTOCOL(prot) (strlen(prot) \
&& strlen(prot) <16 \
&& strspn(prot, LETTERS_NUMBERS "-") == strlen(prot))
extern char * trusted_env[4];
int system_core(char* command, uid_t uid, gid_t gid, char *error);
int safe_system(char* command);
int unpriv_system(char* command, uid_t uid, gid_t gid);
size_t strlcat(char *dst, const char *src, size_t len);
int initsetuid(void);
/* check whether a file exists */
int file_exists(const char *fname);
int file_exists_w(const char *fname); //wildcard filename test
/* Compatibility for the local copy of strlcat,
* which has been removed. */
#define strlcat(src, dst, size) strncat(src, dst, size)
#endif

View File

@@ -13,31 +13,28 @@
#include <fcntl.h>
#include "setuid.h"
#define BUFFER_SIZE 1024
char command[BUFFER_SIZE];
int main(int argc, char *argv[]) {
if (!(initsetuid()))
exit(1);
exit(1);
if (argc < 2) {
fprintf(stderr, "\nNo argument given.\n\nsmartctrl <device>\n\n");
exit(1);
}
sprintf(command, "/var/run/hddshutdown-%s", argv[1]);
FILE *fp = fopen(command,"r");
if( fp ) {
fclose(fp);
printf("\nDisk %s is in Standby. Do nothing because we won't wakeup\n",argv[1]);
exit(1);
if (argc < 2) {
fprintf(stderr, "\nNo argument given.\n\nsmartctrl <device>\n\n");
exit(1);
}
sprintf(command, "smartctl -iHA /dev/%s", argv[1]);
safe_system(command);
char command[STRING_SIZE];
snprintf(command, STRING_SIZE, "/var/run/hddshutdown-%s", argv[1]);
FILE *fp = fopen(command, "r");
if (fp != NULL) {
fclose(fp);
printf("\nDisk %s is in Standby. Do nothing because we won't wakeup\n",argv[1]);
exit(1);
}
snprintf(command, STRING_SIZE, "smartctl -iHA /dev/%s", argv[1]);
safe_system(command);
return 0;
}

View File

@@ -19,8 +19,10 @@
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include "libsmooth.h"
#include "setuid.h"
#include "netutil.h"
#define ERR_ANY 1
#define ERR_SETTINGS 2 /* error in settings file */

View File

@@ -16,9 +16,11 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include "setuid.h"
#include <errno.h>
#include "setuid.h"
#include "netutil.h"
FILE *fd = NULL;
char blue_dev[STRING_SIZE] = "";
char command[STRING_SIZE];

View File

@@ -1,23 +0,0 @@
diff -rup c/resolv/res_send.c d/resolv/res_send.c
--- c/resolv/res_send.c 2012-01-01 05:16:32.000000000 -0700
+++ d/resolv/res_send.c 2012-03-30 12:39:30.862467628 -0600
@@ -409,6 +409,7 @@ __libc_res_nsend(res_state statp, const
*/
if (EXT(statp).nsinit == 0) {
unsigned char map[MAXNS];
+ unsigned int ext_total_nscount;
memset (map, MAXNS, sizeof (map));
for (n = 0; n < MAXNS; n++) {
@@ -422,8 +423,9 @@ __libc_res_nsend(res_state statp, const
}
}
n = statp->nscount;
- if (statp->nscount > EXT(statp).nscount)
- for (n = EXT(statp).nscount, ns = 0;
+ ext_total_nscount = EXT(statp).nscount + EXT(statp).nscount6;
+ if (statp->nscount > ext_total_nscount)
+ for (n = ext_total_nscount, ns = 0;
n < statp->nscount; n++) {
while (ns < MAXNS
&& EXT(statp).nsmap[ns] != MAXNS)

View File

@@ -0,0 +1,87 @@
--- a/resolv/res_query.c 2010-05-04 05:27:23.000000000 -0600
+++ a/resolv/res_query.c 2012-08-03 13:43:10.761506047 -0600
@@ -122,6 +122,7 @@ __libc_res_nquery(res_state statp,
int *resplen2)
{
HEADER *hp = (HEADER *) answer;
+ HEADER *hp2;
int n, use_malloc = 0;
u_int oflags = statp->_flags;
@@ -239,26 +240,25 @@ __libc_res_nquery(res_state statp,
/* __libc_res_nsend might have reallocated the buffer. */
hp = (HEADER *) *answerp;
- /* We simplify the following tests by assigning HP to HP2. It
- is easy to verify that this is the same as ignoring all
- tests of HP2. */
- HEADER *hp2 = answerp2 ? (HEADER *) *answerp2 : hp;
-
- if (n < (int) sizeof (HEADER) && answerp2 != NULL
- && *resplen2 > (int) sizeof (HEADER))
+ /* We simplify the following tests by assigning HP to HP2 or
+ vice versa. It is easy to verify that this is the same as
+ ignoring all tests of HP or HP2. */
+ if (answerp2 == NULL || *resplen2 < (int) sizeof (HEADER))
{
- /* Special case of partial answer. */
- assert (hp != hp2);
- hp = hp2;
+ hp2 = hp;
}
- else if (answerp2 != NULL && *resplen2 < (int) sizeof (HEADER)
- && n > (int) sizeof (HEADER))
+ else
{
- /* Special case of partial answer. */
- assert (hp != hp2);
- hp2 = hp;
+ hp2 = (HEADER *) *answerp2;
+ if (n < (int) sizeof (HEADER))
+ {
+ hp = hp2;
+ }
}
+ /* Make sure both hp and hp2 are defined */
+ assert((hp != NULL) && (hp2 != NULL));
+
if ((hp->rcode != NOERROR || ntohs(hp->ancount) == 0)
&& (hp2->rcode != NOERROR || ntohs(hp2->ancount) == 0)) {
#ifdef DEBUG
--- a/resolv/res_send.c 2012-08-03 13:31:26.622168278 -0600
+++ a/resolv/res_send.c 2012-08-03 13:43:11.881501862 -0600
@@ -549,7 +549,7 @@ __libc_res_nsend(res_state statp, const
ns, ansp, ansp2, nansp2, resplen2);
if (n < 0)
return (-1);
- if (n == 0)
+ if (n == 0 && (buf2 == NULL || *resplen2 == 0))
goto next_ns;
} else {
/* Use datagrams. */
@@ -559,7 +559,7 @@ __libc_res_nsend(res_state statp, const
ansp2, nansp2, resplen2);
if (n < 0)
return (-1);
- if (n == 0)
+ if (n == 0 && (buf2 == NULL || *resplen2 == 0))
goto next_ns;
if (v_circuit)
// XXX Check whether both requests failed or
@@ -1275,10 +1275,14 @@ send_dg(res_state statp,
(*thisresplenp > *thisanssizp)
? *thisanssizp : *thisresplenp);
- if (recvresp1 || (buf2 != NULL && recvresp2))
+ if (recvresp1 || (buf2 != NULL && recvresp2)) {
+ *resplen2 = 0;
return resplen;
+ }
if (buf2 != NULL)
{
+ /* No data from the first reply. */
+ resplen = 0;
/* We are waiting for a possible second reply. */
if (hp->id == anhp->id)
recvresp1 = 1;

View File

@@ -0,0 +1,12 @@
diff -rup a/nss/getnssent.c b/nss/getnssent.c
--- a/nss/getnssent.c 2004-12-13 14:48:34.000000000 -0700
+++ b/nss/getnssent.c 2012-03-23 13:46:54.639095121 -0600
@@ -33,7 +33,7 @@ __nss_getent (getent_r_function func, vo
*buffer = malloc (*buffer_size);
}
- while (buffer != NULL
+ while (*buffer != NULL
&& func (resbuf, *buffer, *buffer_size, &result, h_errnop) == ERANGE
&& (h_errnop == NULL || *h_errnop == NETDB_INTERNAL))
{

View File

@@ -0,0 +1,89 @@
diff -rup a/localedata/locales/fi_FI b/localedata/locales/fi_FI
--- a/localedata/locales/fi_FI 2012-07-11 14:48:45.994749607 -0600
+++ b/localedata/locales/fi_FI 2012-07-11 14:50:20.003277477 -0600
@@ -63,60 +63,65 @@ reorder-after <z>
<a-diaerisis>
<o-diaerisis>
-reorder-after <U005A>
+reorder-after <U007A>
<U00E5> <a-ring>;<BAS>;<MIN>;IGNORE
-<U00C5> <a-ring>;<BAS>;<CAP>;IGNORE
<U01FB> <a-ring>;<ACA>;<MIN>;IGNORE
-<U01FA> <a-ring>;<ACA>;<CAP>;IGNORE
<U00E4> <a-diaerisis>;<BAS>;<MIN>;IGNORE
-<U00C4> <a-diaerisis>;<BAS>;<CAP>;IGNORE
<U00E6> <a-diaerisis>;<REU>;<MIN>;IGNORE
-<U00C6> <a-diaerisis>;<REU>;<CAP>;IGNORE
<U01FD> <a-diaerisis>;<U01FD>;<MIN>;IGNORE
-<U01FC> <a-diaerisis>;<U01FD>;<CAP>;IGNORE
<U01E3> <a-diaerisis>;<MAC>;<MIN>;IGNORE
-<U01E2> <a-diaerisis>;<MAC>;<CAP>;IGNORE
<U00F6> <o-diaerisis>;<BAS>;<MIN>;IGNORE
-<U00D6> <o-diaerisis>;<BAS>;<CAP>;IGNORE
<U00F8> <o-diaerisis>;<U00D8>;<MIN>;IGNORE
-<U00D8> <o-diaerisis>;<U00D8>;<CAP>;IGNORE
<U01FF> <o-diaerisis>;<U01FF>;<MIN>;IGNORE
-<U01FE> <o-diaerisis>;<U01FF>;<CAP>;IGNORE
<U00F5> <o-diaerisis>;<TIL>;<MIN>;IGNORE
+reorder-after <U005A>
+<U00C5> <a-ring>;<BAS>;<CAP>;IGNORE
+<U01FA> <a-ring>;<ACA>;<CAP>;IGNORE
+<U00C4> <a-diaerisis>;<BAS>;<CAP>;IGNORE
+<U00C6> <a-diaerisis>;<REU>;<CAP>;IGNORE
+<U01FC> <a-diaerisis>;<U01FD>;<CAP>;IGNORE
+<U01E2> <a-diaerisis>;<MAC>;<CAP>;IGNORE
+<U00D6> <o-diaerisis>;<BAS>;<CAP>;IGNORE
+<U00D8> <o-diaerisis>;<U00D8>;<CAP>;IGNORE
+<U01FE> <o-diaerisis>;<U01FF>;<CAP>;IGNORE
<U00D5> <o-diaerisis>;<TIL>;<CAP>;IGNORE
-reorder-after <U016A>
+reorder-after <U016B>
<U0076> <v>;<U0056>;<BAS>;<MIN>
-<U0056> <v>;<U0056>;<BAS>;<CAP>
<U1E7D> <v>;<U0056>;<TIL>;<MIN>
-<U1E7C> <v>;<U0056>;<TIL>;<CAP>
<U0077> <w>;<U0057>;<BAS>;<MIN>
-<U0057> <w>;<U0057>;<BAS>;<CAP>
<U1E83> <w>;<U0057>;<ACA>;<MIN>
-<U1E82> <w>;<U0057>;<ACA>;<CAP>
<U1E81> <w>;<U0057>;<GRA>;<MIN>
-<U1E80> <w>;<U0057>;<GRA>;<CAP>
<U0175> <w>;<U0057>;<CIR>;<MIN>
-<U0174> <w>;<U0057>;<CIR>;<CAP>
<U1E85> <w>;<U0057>;<REU>;<MIN>
-<U1E84> <w>;<U0057>;<REU>;<CAP>
<U1E87> <w>;<U0057>;<PCT>;<MIN>
+reorder-after <U016A>
+<U0056> <v>;<U0056>;<BAS>;<CAP>
+<U1E7C> <v>;<U0056>;<TIL>;<CAP>
+<U0057> <w>;<U0057>;<BAS>;<CAP>
+<U1E82> <w>;<U0057>;<ACA>;<CAP>
+<U1E80> <w>;<U0057>;<GRA>;<CAP>
+<U0174> <w>;<U0057>;<CIR>;<CAP>
+<U1E84> <w>;<U0057>;<REU>;<CAP>
<U1E86> <w>;<U0057>;<PCT>;<CAP>
reorder-after <U00FF>
<U00FC> <y>;<DTT>;<MIN>;IGNORE
+reorder-after <U0178>
<U00DC> <y>;<DTT>;<CAP>;IGNORE
% Present in iso14651_t1, but these definitions seem to have been
% removed from latest iso14651 tables.
-reorder-after <U0162>
+reorder-after <U0163>
<U00FE> "<t><h>";"<LIG><LIG>";"<MIN><MIN>";IGNORE
+reorder-after <U0162>
<U00DE> "<t><h>";"<LIG><LIG>";"<CAP><CAP>";IGNORE
reorder-after <U0064>
<U00F0> <d>;<PCL>;<MIN>;IGNORE
-<U00D0> <d>;<PCL>;<CAP>;IGNORE
<U0111> <d>;<OBL>;<MIN>;IGNORE
+reorder-after <U0044>
+<U00D0> <d>;<PCL>;<CAP>;IGNORE
<U0110> <d>;<OBL>;<CAP>;IGNORE
reorder-end

View File

@@ -0,0 +1,25 @@
diff --git a/iconvdata/ibm930.c b/iconvdata/ibm930.c
index 25a9be0..6f758eb 100644
--- a/iconvdata/ibm930.c
+++ b/iconvdata/ibm930.c
@@ -162,7 +162,8 @@ enum
while (ch > rp2->end) \
++rp2; \
\
- if (__builtin_expect (ch < rp2->start, 0) \
+ if (__builtin_expect (rp2->start == 0xffff, 0) \
+ || __builtin_expect (ch < rp2->start, 0) \
|| (res = __ibm930db_to_ucs4[ch + rp2->idx], \
__builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \
{ \
@@ -215,7 +216,8 @@ enum
while (ch > rp2->end) \
++rp2; \
\
- if (__builtin_expect (ch < rp2->start, 0) \
+ if (__builtin_expect (rp2->start == 0xffff, 0) \
+ || __builtin_expect (ch < rp2->start, 0) \
|| (cp = __ucs4_to_ibm930db[ch + rp2->idx], \
__builtin_expect (cp[0], L'\1')== L'\0' && ch != '\0')) \
{ \

View File

@@ -0,0 +1,80 @@
diff -Nrup a/posix/fnmatch.c b/posix/fnmatch.c
--- a/posix/fnmatch.c 2012-05-25 12:37:26.566678872 -0400
+++ b/posix/fnmatch.c 2012-05-25 13:08:44.451972286 -0400
@@ -333,6 +333,7 @@ fnmatch (pattern, string, flags)
# if HANDLE_MULTIBYTE
if (__builtin_expect (MB_CUR_MAX, 1) != 1)
{
+ const char *orig_pattern = pattern;
mbstate_t ps;
size_t n;
const char *p;
@@ -356,10 +357,9 @@ fnmatch (pattern, string, flags)
alloca_used);
n = mbsrtowcs (wpattern, &p, n + 1, &ps);
if (__builtin_expect (n == (size_t) -1, 0))
- /* Something wrong.
- XXX Do we have to set `errno' to something which mbsrtows hasn't
- already done? */
- return -1;
+ /* Something wrong: Fall back to single byte matching. */
+ goto try_singlebyte;
+
if (p)
{
memset (&ps, '\0', sizeof (ps));
@@ -371,10 +371,8 @@ fnmatch (pattern, string, flags)
prepare_wpattern:
n = mbsrtowcs (NULL, &pattern, 0, &ps);
if (__builtin_expect (n == (size_t) -1, 0))
- /* Something wrong.
- XXX Do we have to set `errno' to something which mbsrtows hasn't
- already done? */
- return -1;
+ /* Something wrong: Fall back to single byte matching. */
+ goto try_singlebyte;
if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0))
{
__set_errno (ENOMEM);
@@ -401,14 +399,8 @@ fnmatch (pattern, string, flags)
alloca_used);
n = mbsrtowcs (wstring, &p, n + 1, &ps);
if (__builtin_expect (n == (size_t) -1, 0))
- {
- /* Something wrong.
- XXX Do we have to set `errno' to something which
- mbsrtows hasn't already done? */
- free_return:
- free (wpattern_malloc);
- return -1;
- }
+ /* Something wrong: Fall back to single byte matching. */
+ goto free_and_try_singlebyte;
if (p)
{
memset (&ps, '\0', sizeof (ps));
@@ -420,10 +412,8 @@ fnmatch (pattern, string, flags)
prepare_wstring:
n = mbsrtowcs (NULL, &string, 0, &ps);
if (__builtin_expect (n == (size_t) -1, 0))
- /* Something wrong.
- XXX Do we have to set `errno' to something which mbsrtows hasn't
- already done? */
- goto free_return;
+ /* Something wrong: Fall back to single byte matching. */
+ goto free_and_try_singlebyte;
if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0))
{
free (wpattern_malloc);
@@ -450,6 +440,11 @@ fnmatch (pattern, string, flags)
free (wpattern_malloc);
return res;
+
+ free_and_try_singlebyte:
+ free(wpattern_malloc);
+ try_singlebyte:
+ pattern = orig_pattern;
}
# endif /* mbstate_t and mbsrtowcs or _LIBC. */

View File

@@ -0,0 +1,250 @@
diff -pruN glibc-2.12-2-gc4ccff1/libio/Makefile glibc-2.12-2-gc4ccff1.fseek/libio/Makefile
--- glibc-2.12-2-gc4ccff1/libio/Makefile 2010-05-04 16:57:23.000000000 +0530
+++ glibc-2.12-2-gc4ccff1.fseek/libio/Makefile 2012-09-05 17:28:08.699360413 +0530
@@ -58,7 +58,7 @@ tests = tst_swprintf tst_wprintf tst_sws
tst-memstream1 tst-memstream2 \
tst-wmemstream1 tst-wmemstream2 \
bug-memstream1 bug-wmemstream1 \
- tst-setvbuf1 tst-popen1 tst-fgetwc bug-wsetpos
+ tst-setvbuf1 tst-popen1 tst-fgetwc bug-wsetpos tst-fseek
test-srcs = test-freopen
all: # Make this the default target; it will be defined in Rules.
diff -pruN glibc-2.12-2-gc4ccff1/libio/tst-fseek.c glibc-2.12-2-gc4ccff1.fseek/libio/tst-fseek.c
--- glibc-2.12-2-gc4ccff1/libio/tst-fseek.c 1970-01-01 05:30:00.000000000 +0530
+++ glibc-2.12-2-gc4ccff1.fseek/libio/tst-fseek.c 2012-09-05 17:27:33.606359692 +0530
@@ -0,0 +1,153 @@
+/* Verify that fseek/ftell combination works for wide chars.
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <errno.h>
+#include <wchar.h>
+#include <unistd.h>
+#include <string.h>
+
+/* Defined in test-skeleton.c. */
+static int create_temp_file (const char *base, char **filename);
+
+
+static int
+do_seek_end (FILE *fp)
+{
+ long save;
+
+ if (fp == NULL)
+ {
+ printf ("do_seek_end: fopen: %s\n", strerror (errno));
+ return 1;
+ }
+
+ if (fputws (L"abc\n", fp) == -1)
+ {
+ printf ("do_seek_end: fputws: %s\n", strerror (errno));
+ return 1;
+ }
+
+ save = ftell (fp);
+ rewind (fp);
+
+ if (fseek (fp, 0, SEEK_END) == -1)
+ {
+ printf ("do_seek_end: fseek: %s\n", strerror (errno));
+ return 1;
+ }
+
+ if (save != ftell (fp))
+ {
+ printf ("save = %ld, ftell = %ld\n", save, ftell (fp));
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+do_seek_set (FILE *fp)
+{
+ long save;
+
+ if (fputws (L"abc\n", fp) == -1)
+ {
+ printf ("seek_set: fputws: %s\n", strerror (errno));
+ return 1;
+ }
+
+ save = ftell (fp);
+
+ if (fputws (L"xyz\n", fp) == -1)
+ {
+ printf ("seek_set: fputws: %s\n", strerror (errno));
+ return 1;
+ }
+
+ if (fseek (fp, save, SEEK_SET) == -1)
+ {
+ printf ("seek_set: fseek: %s\n", strerror (errno));
+ return 1;
+ }
+
+ if (save != ftell (fp))
+ {
+ printf ("save = %ld, ftell = %ld\n", save, ftell (fp));
+ return 1;
+ }
+
+ return 0;
+}
+
+static int
+do_test (void)
+{
+ if (setlocale (LC_ALL, "en_US.utf8") == NULL)
+ {
+ printf ("Cannot set en_US.utf8 locale.\n");
+ exit (1);
+ }
+
+ int ret = 0;
+ char *filename;
+ int fd = create_temp_file ("tst-fseek.out", &filename);
+
+ if (fd == -1)
+ return 1;
+
+ FILE *fp = fdopen (fd, "w+");
+ if (fp == NULL)
+ {
+ printf ("seek_set: fopen: %s\n", strerror (errno));
+ close (fd);
+ return 1;
+ }
+
+ if (do_seek_set (fp))
+ {
+ printf ("SEEK_SET test failed\n");
+ ret = 1;
+ }
+
+ /* Reopen the file. */
+ fclose (fp);
+ fp = fopen (filename, "w+");
+ if (fp == NULL)
+ {
+ printf ("seek_end: fopen: %s\n", strerror (errno));
+ return 1;
+ }
+
+ if (do_seek_end (fp))
+ {
+ printf ("SEEK_END test failed\n");
+ ret = 1;
+ }
+
+ fclose (fp);
+
+ return ret;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff -pruN glibc-2.12-2-gc4ccff1/libio/wfileops.c glibc-2.12-2-gc4ccff1.fseek/libio/wfileops.c
--- glibc-2.12-2-gc4ccff1/libio/wfileops.c 2010-05-04 16:57:23.000000000 +0530
+++ glibc-2.12-2-gc4ccff1.fseek/libio/wfileops.c 2012-09-05 17:27:33.608359685 +0530
@@ -547,6 +547,55 @@ _IO_wfile_sync (fp)
}
INTDEF(_IO_wfile_sync)
+/* Adjust the internal buffer pointers to reflect the state in the external
+ buffer. The content between fp->_IO_read_base and fp->_IO_read_ptr is
+ assumed to be converted and available in the range
+ fp->_wide_data->_IO_read_base and fp->_wide_data->_IO_read_end. */
+static inline int
+adjust_wide_data (_IO_FILE *fp, bool do_convert)
+{
+ struct _IO_codecvt *cv = fp->_codecvt;
+
+ int clen = (*cv->__codecvt_do_encoding) (cv);
+
+ /* Take the easy way out for constant length encodings if we don't need to
+ convert. */
+ if (!do_convert && clen > 0)
+ {
+ fp->_wide_data->_IO_read_end += ((fp->_IO_read_ptr - fp->_IO_read_base)
+ / clen);
+ goto done;
+ }
+
+ enum __codecvt_result status;
+ const char *read_stop = (const char *) fp->_IO_read_base;
+ do
+ {
+
+ fp->_wide_data->_IO_last_state = fp->_wide_data->_IO_state;
+ status = (*cv->__codecvt_do_in) (cv, &fp->_wide_data->_IO_state,
+ fp->_IO_read_base, fp->_IO_read_ptr,
+ &read_stop,
+ fp->_wide_data->_IO_read_base,
+ fp->_wide_data->_IO_buf_end,
+ &fp->_wide_data->_IO_read_end);
+
+ /* Should we return EILSEQ? */
+ if (__builtin_expect (status == __codecvt_error, 0))
+ {
+ fp->_flags |= _IO_ERR_SEEN;
+ return -1;
+ }
+ }
+ while (__builtin_expect (status == __codecvt_partial, 0));
+
+done:
+ /* Now seek to the end of the read buffer. */
+ fp->_wide_data->_IO_read_ptr = fp->_wide_data->_IO_read_end;
+
+ return 0;
+}
+
_IO_off64_t
_IO_wfile_seekoff (fp, offset, dir, mode)
_IO_FILE *fp;
@@ -695,6 +744,10 @@ _IO_wfile_seekoff (fp, offset, dir, mode
fp->_wide_data->_IO_buf_base);
_IO_wsetp (fp, fp->_wide_data->_IO_buf_base,
fp->_wide_data->_IO_buf_base);
+
+ if (adjust_wide_data (fp, false))
+ goto dumb;
+
_IO_mask_flags (fp, 0, _IO_EOF_SEEN);
goto resync;
}
@@ -735,6 +788,10 @@ _IO_wfile_seekoff (fp, offset, dir, mode
_IO_wsetg (fp, fp->_wide_data->_IO_buf_base,
fp->_wide_data->_IO_buf_base, fp->_wide_data->_IO_buf_base);
_IO_wsetp (fp, fp->_wide_data->_IO_buf_base, fp->_wide_data->_IO_buf_base);
+
+ if (adjust_wide_data (fp, true))
+ goto dumb;
+
fp->_offset = result + count;
_IO_mask_flags (fp, 0, _IO_EOF_SEEN);
return offset;

View File

@@ -0,0 +1,403 @@
diff -Nrup a/stdio-common/bug22.c b/stdio-common/bug22.c
--- a/stdio-common/bug22.c 2010-05-04 05:27:23.000000000 -0600
+++ b/stdio-common/bug22.c 2012-08-03 13:56:40.887829210 -0600
@@ -1,12 +1,22 @@
/* BZ #5424 */
#include <stdio.h>
+#include <errno.h>
+/* INT_MAX + 1 */
#define N 2147483648
+/* (INT_MAX / 2) + 2 */
+#define N2 1073741825
+
+/* INT_MAX - 3 */
+#define N3 2147483644
+
#define STRINGIFY(S) #S
#define MAKE_STR(S) STRINGIFY(S)
#define SN MAKE_STR(N)
+#define SN2 MAKE_STR(N2)
+#define SN3 MAKE_STR(N3)
static int
do_test (void)
@@ -20,13 +30,27 @@ do_test (void)
return 1;
}
- ret = fprintf (fp, "%" SN "d%" SN "d", 1, 1);
+ ret = fprintf (fp, "%" SN "d", 1);
+ printf ("ret = %d\n", ret);
+ if (ret != -1 || errno != EOVERFLOW)
+ return 1;
+
+ ret = fprintf (fp, "%." SN "d", 1);
+ printf ("ret = %d\n", ret);
+ if (ret != -1 || errno != EOVERFLOW)
+ return 1;
+
+ ret = fprintf (fp, "%." SN3 "d", 1);
+ printf ("ret = %d\n", ret);
+ if (ret != -1 || errno != EOVERFLOW)
+ return 1;
+ ret = fprintf (fp, "%" SN2 "d%" SN2 "d", 1, 1);
printf ("ret = %d\n", ret);
- return ret != -1;
+ return ret != -1 || errno != EOVERFLOW;
}
-#define TIMEOUT 30
+#define TIMEOUT 60
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
diff -Nrup a/stdio-common/printf-parse.h b/stdio-common/printf-parse.h
--- a/stdio-common/printf-parse.h 2010-05-04 05:27:23.000000000 -0600
+++ b/stdio-common/printf-parse.h 2012-08-03 13:57:31.932638761 -0600
@@ -14,9 +14,8 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
#include <printf.h>
#include <stdint.h>
@@ -69,16 +68,27 @@ union printf_arg
#ifndef DONT_NEED_READ_INT
/* Read a simple integer from a string and update the string pointer.
It is assumed that the first character is a digit. */
-static unsigned int
+static int
read_int (const UCHAR_T * *pstr)
{
- unsigned int retval = **pstr - L_('0');
+ int retval = **pstr - L_('0');
while (ISDIGIT (*++(*pstr)))
- {
- retval *= 10;
- retval += **pstr - L_('0');
- }
+ if (retval >= 0)
+ {
+ if (INT_MAX / 10 < retval)
+ retval = -1;
+ else
+ {
+ int digit = **pstr - L_('0');
+
+ retval *= 10;
+ if (INT_MAX - digit < retval)
+ retval = -1;
+ else
+ retval += digit;
+ }
+ }
return retval;
}
diff -Nrup a/stdio-common/printf-parsemb.c b/stdio-common/printf-parsemb.c
--- a/stdio-common/printf-parsemb.c 2010-05-04 05:27:23.000000000 -0600
+++ b/stdio-common/printf-parsemb.c 2012-08-03 13:58:44.683366361 -0600
@@ -13,9 +13,8 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
#include <ctype.h>
#include <limits.h>
@@ -88,12 +87,15 @@ __parse_one_specmb (const UCHAR_T *forma
n = read_int (&format);
- if (n > 0 && *format == L_('$'))
+ if (n != 0 && *format == L_('$'))
/* Is positional parameter. */
{
++format; /* Skip the '$'. */
- spec->data_arg = n - 1;
- *max_ref_arg = MAX (*max_ref_arg, n);
+ if (n != -1)
+ {
+ spec->data_arg = n - 1;
+ *max_ref_arg = MAX (*max_ref_arg, n);
+ }
}
else
/* Oops; that was actually the width and/or 0 padding flag.
@@ -161,10 +163,13 @@ __parse_one_specmb (const UCHAR_T *forma
/* The width argument might be found in a positional parameter. */
n = read_int (&format);
- if (n > 0 && *format == L_('$'))
+ if (n != 0 && *format == L_('$'))
{
- spec->width_arg = n - 1;
- *max_ref_arg = MAX (*max_ref_arg, n);
+ if (n != -1)
+ {
+ spec->width_arg = n - 1;
+ *max_ref_arg = MAX (*max_ref_arg, n);
+ }
++format; /* Skip '$'. */
}
}
@@ -178,9 +183,13 @@ __parse_one_specmb (const UCHAR_T *forma
}
}
else if (ISDIGIT (*format))
- /* Constant width specification. */
- spec->info.width = read_int (&format);
+ {
+ int n = read_int (&format);
+ /* Constant width specification. */
+ if (n != -1)
+ spec->info.width = n;
+ }
/* Get the precision. */
spec->prec_arg = -1;
/* -1 means none given; 0 means explicit 0. */
@@ -197,10 +206,13 @@ __parse_one_specmb (const UCHAR_T *forma
{
n = read_int (&format);
- if (n > 0 && *format == L_('$'))
+ if (n != 0 && *format == L_('$'))
{
- spec->prec_arg = n - 1;
- *max_ref_arg = MAX (*max_ref_arg, n);
+ if (n != -1)
+ {
+ spec->prec_arg = n - 1;
+ *max_ref_arg = MAX (*max_ref_arg, n);
+ }
++format;
}
}
@@ -214,7 +226,12 @@ __parse_one_specmb (const UCHAR_T *forma
}
}
else if (ISDIGIT (*format))
- spec->info.prec = read_int (&format);
+ {
+ int n = read_int (&format);
+
+ if (n != -1)
+ spec->info.prec = n;
+ }
else
/* "%.?" is treated like "%.0?". */
spec->info.prec = 0;
@@ -295,9 +312,9 @@ __parse_one_specmb (const UCHAR_T *forma
/* We don't try to get the types for all arguments if the format
uses more than one. The normal case is covered though. If
the call returns -1 we continue with the normal specifiers. */
- || (spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
- (&spec->info, 1, &spec->data_arg_type,
- &spec->size)) < 0)
+ || (int) (spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
+ (&spec->info, 1, &spec->data_arg_type,
+ &spec->size)) < 0)
{
/* Find the data argument types of a built-in spec. */
spec->ndata_args = 1;
diff -Nrup a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
--- a/stdio-common/vfprintf.c 2012-08-03 13:31:26.605168350 -0600
+++ b/stdio-common/vfprintf.c 2012-08-03 14:09:26.836725512 -0600
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2008, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -12,9 +12,8 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
#include <ctype.h>
#include <limits.h>
@@ -67,10 +66,10 @@
do { \
unsigned int _val = val; \
assert ((unsigned int) done < (unsigned int) INT_MAX); \
- if (__builtin_expect ((unsigned int) INT_MAX - (unsigned int) done \
- < _val, 0)) \
+ if (__builtin_expect (INT_MAX - done < _val, 0)) \
{ \
done = -1; \
+ __set_errno (EOVERFLOW); \
goto all_done; \
} \
done += _val; \
@@ -141,12 +140,17 @@
do \
{ \
assert ((size_t) done <= (size_t) INT_MAX); \
- if ((size_t) PUT (s, (String), (Len)) != (size_t) (Len) \
- || (size_t) INT_MAX - (size_t) done < (size_t) (Len)) \
+ if ((size_t) PUT (s, (String), (Len)) != (size_t) (Len)) \
{ \
done = -1; \
goto all_done; \
} \
+ if (__builtin_expect (INT_MAX - done < (Len), 0)) \
+ { \
+ done = -1; \
+ __set_errno (EOVERFLOW); \
+ goto all_done; \
+ } \
done += (Len); \
} \
while (0)
@@ -1435,10 +1439,21 @@ vfprintf (FILE *s, const CHAR_T *format,
const UCHAR_T *tmp; /* Temporary value. */
tmp = ++f;
- if (ISDIGIT (*tmp) && read_int (&tmp) && *tmp == L_('$'))
- /* The width comes from a positional parameter. */
- goto do_positional;
+ if (ISDIGIT (*tmp))
+ {
+ int pos = read_int (&tmp);
+ if (pos == -1)
+ {
+ __set_errno (EOVERFLOW);
+ done = -1;
+ goto all_done;
+ }
+
+ if (pos && *tmp == L_('$'))
+ /* The width comes from a positional parameter. */
+ goto do_positional;
+ }
width = va_arg (ap, int);
/* Negative width means left justified. */
@@ -1449,9 +1464,9 @@ vfprintf (FILE *s, const CHAR_T *format,
left = 1;
}
- if (__builtin_expect (width >= (size_t) -1 / sizeof (CHAR_T) - 32, 0))
+ if (__builtin_expect (width >= INT_MAX / sizeof (CHAR_T) - 32, 0))
{
- __set_errno (ERANGE);
+ __set_errno (EOVERFLOW);
done = -1;
goto all_done;
}
@@ -1481,9 +1496,10 @@ vfprintf (FILE *s, const CHAR_T *format,
LABEL (width):
width = read_int (&f);
- if (__builtin_expect (width >= (size_t) -1 / sizeof (CHAR_T) - 32, 0))
+ if (__builtin_expect (width == -1
+ || width >= INT_MAX / sizeof (CHAR_T) - 32, 0))
{
- __set_errno (ERANGE);
+ __set_errno (EOVERFLOW);
done = -1;
goto all_done;
}
@@ -1518,10 +1534,21 @@ vfprintf (FILE *s, const CHAR_T *format,
const UCHAR_T *tmp; /* Temporary value. */
tmp = ++f;
- if (ISDIGIT (*tmp) && read_int (&tmp) > 0 && *tmp == L_('$'))
- /* The precision comes from a positional parameter. */
- goto do_positional;
+ if (ISDIGIT (*tmp))
+ {
+ int pos = read_int (&tmp);
+
+ if (pos == -1)
+ {
+ __set_errno (EOVERFLOW);
+ done = -1;
+ goto all_done;
+ }
+ if (pos && *tmp == L_('$'))
+ /* The precision comes from a positional parameter. */
+ goto do_positional;
+ }
prec = va_arg (ap, int);
/* If the precision is negative the precision is omitted. */
@@ -1529,15 +1556,26 @@ vfprintf (FILE *s, const CHAR_T *format,
prec = -1;
}
else if (ISDIGIT (*f))
- prec = read_int (&f);
+ {
+ prec = read_int (&f);
+
+ /* The precision was specified in this case as an extremely
+ large positive value. */
+ if (prec == -1)
+ {
+ __set_errno (EOVERFLOW);
+ done = -1;
+ goto all_done;
+ }
+ }
else
prec = 0;
if (prec > width
&& prec > sizeof (work_buffer) / sizeof (work_buffer[0]) - 32)
{
- if (__builtin_expect (prec >= (size_t) -1 / sizeof (CHAR_T) - 32, 0))
+ if (__builtin_expect (prec >= INT_MAX / sizeof (CHAR_T) - 32, 0))
{
- __set_errno (ERANGE);
+ __set_errno (EOVERFLOW);
done = -1;
goto all_done;
}
@@ -1722,13 +1760,13 @@ do_positional:
nargs = MAX (nargs, max_ref_arg);
/* Calculate total size needed to represent a single argument across
all three argument-related arrays. */
- bytes_per_arg = sizeof (*args_value) + sizeof (*args_size)
- + sizeof (*args_type);
+ bytes_per_arg = (sizeof (*args_value) + sizeof (*args_size)
+ + sizeof (*args_type));
/* Check for potential integer overflow. */
- if (__builtin_expect (nargs > SIZE_MAX / bytes_per_arg, 0))
+ if (__builtin_expect (nargs > INT_MAX / bytes_per_arg, 0))
{
- __set_errno (ERANGE);
+ __set_errno (EOVERFLOW);
done = -1;
goto all_done;
}
@@ -1746,6 +1784,8 @@ do_positional:
}
}
+ /* Set up the remaining two arrays to each point past the end of the
+ prior array, since space for all three has been allocated now. */
args_size = &args_value[nargs].pa_int;
args_type = &args_size[nargs];
memset (args_type, s->_flags2 & _IO_FLAGS2_FORTIFY ? '\xff' : '\0',

View File

@@ -0,0 +1,19 @@
diff -Nrup a/locale/loadlocale.c b/locale/loadlocale.c
--- a/locale/loadlocale.c 2010-05-04 07:27:23.000000000 -0400
+++ b/locale/loadlocale.c 2012-08-05 17:19:47.761384155 -0400
@@ -170,7 +170,6 @@ _nl_load_locale (struct loaded_l10nfile
int save_err;
int alloc = ld_mapped;
- file->decided = 1;
file->data = NULL;
fd = open_not_cancel_2 (file->filename, O_RDONLY);
@@ -279,6 +278,7 @@ _nl_load_locale (struct loaded_l10nfile
newdata->alloc = alloc;
file->data = newdata;
+ file->decided = 1;
}
void

View File

@@ -0,0 +1,22 @@
diff --git a/sysdeps/gnu/errlist.c b/sysdeps/gnu/errlist.c
index e3d2faf..5437ff8 100644
--- a/sysdeps/gnu/errlist.c
+++ b/sysdeps/gnu/errlist.c
@@ -780,11 +780,12 @@ TRANS The user's disk quota was exceeded. */
#endif
#ifdef ESTALE
/*
-TRANS Stale NFS file handle. This indicates an internal confusion in the NFS
-TRANS system which is due to file system rearrangements on the server host.
-TRANS Repairing this condition usually requires unmounting and remounting
-TRANS the NFS file system on the local host. */
- [ERR_REMAP (ESTALE)] = N_("Stale NFS file handle"),
+TRANS Stale file handle. This indicates an internal confusion in the
+TRANS file system which is due to file system rearrangements on the server host
+TRANS for NFS filesystems or corruption in other filesystems.
+TRANS Repairing this condition usually requires unmounting, possibly
+TRANS repairing and remounting the file system. */
+ [ERR_REMAP (ESTALE)] = N_("Stale file handle"),
# if ESTALE > ERR_MAX
# undef ERR_MAX
# define ERR_MAX ESTALE

View File

@@ -1,30 +0,0 @@
diff -rup a/resolv/res_send.c b/resolv/res_send.c
--- a/resolv/res_send.c 2012-06-28 11:55:38.361886650 -0600
+++ b/resolv/res_send.c 2012-06-28 11:51:38.253963687 -0600
@@ -424,17 +424,15 @@ __libc_res_nsend(res_state statp, const
}
n = statp->nscount;
ext_total_nscount = EXT(statp).nscount + EXT(statp).nscount6;
- if (statp->nscount > ext_total_nscount)
- for (n = ext_total_nscount, ns = 0;
- n < statp->nscount; n++) {
- while (ns < MAXNS
- && EXT(statp).nsmap[ns] != MAXNS)
- ns++;
- if (ns == MAXNS)
- break;
- EXT(statp).nsmap[ns] = n;
- map[n] = ns++;
- }
+ for (n = 0, ns = 0; n < statp->nscount - ext_total_nscount; n++) {
+ while (ns < MAXNS
+ && EXT(statp).nsmap[ns] != MAXNS)
+ ns++;
+ if (ns == MAXNS)
+ break;
+ EXT(statp).nsmap[ns] = n;
+ map[n] = ns++;
+ }
EXT(statp).nscount = n;
for (ns = 0; ns < EXT(statp).nscount; ns++) {
n = map[ns];

View File

@@ -0,0 +1,54 @@
diff -rup a/nss/nsswitch.h b/nss/nsswitch.h
--- a/nss/nsswitch.h 2010-05-04 05:27:23.000000000 -0600
+++ b/nss/nsswitch.h 2012-07-05 11:28:15.316585117 -0600
@@ -182,4 +182,8 @@ extern int __nss_hostname_digits_dots (c
int *h_errnop);
libc_hidden_proto (__nss_hostname_digits_dots)
+/* Maximum number of aliases we allow. */
+#define MAX_NR_ALIASES 48
+#define MAX_NR_ADDRS 48
+
#endif /* nsswitch.h */
Only in b/nss: nsswitch.h.orig
diff -rup a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c
--- a/resolv/nss_dns/dns-host.c 2012-07-05 11:27:39.298760961 -0600
+++ b/resolv/nss_dns/dns-host.c 2012-07-05 11:28:15.317585112 -0600
@@ -89,10 +89,6 @@
#define RESOLVSORT
-/* Maximum number of aliases we allow. */
-#define MAX_NR_ALIASES 48
-#define MAX_NR_ADDRS 48
-
#if PACKETSZ > 65536
# define MAXPACKET PACKETSZ
#else
Only in b/resolv/nss_dns: dns-host.c.orig
diff -rup a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
--- a/sysdeps/posix/getaddrinfo.c 2012-07-05 11:27:39.284761028 -0600
+++ b/sysdeps/posix/getaddrinfo.c 2012-07-05 14:15:39.785546125 -0600
@@ -565,7 +565,10 @@ gaih_inet (const char *name, const struc
IPv6 scope ids. */
if (req->ai_family == AF_INET)
{
- size_t tmpbuflen = 512;
+ /* Add room for struct host_data in resolv/nss_dns/dns-host.c */
+ size_t tmpbuflen = 512 + (MAX_NR_ALIASES+MAX_NR_ADDRS+1)*sizeof(char*)
+ + 16 * sizeof(char);
+
assert (tmpbuf == NULL);
tmpbuf = alloca_account (tmpbuflen, alloca_used);
int rc;
@@ -807,7 +810,7 @@ gaih_inet (const char *name, const struc
old_res_options = _res.options;
_res.options &= ~RES_USE_INET6;
- size_t tmpbuflen = 1024;
+ size_t tmpbuflen = 1024 + sizeof(struct gaih_addrtuple);
malloc_tmpbuf = !__libc_use_alloca (alloca_used + tmpbuflen);
assert (tmpbuf == NULL);
if (!malloc_tmpbuf)
Only in b/sysdeps/posix: getaddrinfo.c.orig
Only in b/sysdeps/posix: getaddrinfo.c.rej

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,42 @@
diff -rup a/resolv/res_init.c b/resolv/res_init.c
--- a/resolv/res_init.c 2012-07-26 15:10:45.655638776 -0600
+++ b/resolv/res_init.c 2012-07-26 15:11:27.731423002 -0600
@@ -314,9 +314,9 @@ __res_vinit(res_state statp, int preinit
cp++;
if ((*cp != '\0') && (*cp != '\n')
&& __inet_aton(cp, &a)) {
- statp->nsaddr_list[nservall].sin_addr = a;
- statp->nsaddr_list[nservall].sin_family = AF_INET;
- statp->nsaddr_list[nservall].sin_port =
+ statp->nsaddr_list[nserv].sin_addr = a;
+ statp->nsaddr_list[nserv].sin_family = AF_INET;
+ statp->nsaddr_list[nserv].sin_port =
htons(NAMESERVER_PORT);
nserv++;
#ifdef _LIBC
diff -rup a/resolv/res_send.c b/resolv/res_send.c
--- a/resolv/res_send.c 2010-05-04 05:27:23.000000000 -0600
+++ b/resolv/res_send.c 2012-07-26 15:34:58.398261659 -0600
@@ -421,10 +421,10 @@ __libc_res_nsend(res_state statp, const
EXT(statp).nsmap[n] = MAXNS;
}
}
- n = statp->nscount;
- if (statp->nscount > EXT(statp).nscount)
+ n = statp->nscount - EXT(statp).nscount6;
+ if (n > EXT(statp).nscount)
for (n = EXT(statp).nscount, ns = 0;
- n < statp->nscount; n++) {
+ n < statp->nscount - EXT(statp).nscount6; n++) {
while (ns < MAXNS
&& EXT(statp).nsmap[ns] != MAXNS)
ns++;
@@ -441,7 +441,7 @@ __libc_res_nsend(res_state statp, const
malloc(sizeof (struct sockaddr_in6));
if (EXT(statp).nsaddrs[n] != NULL) {
memset (mempcpy(EXT(statp).nsaddrs[n],
- &statp->nsaddr_list[n],
+ &statp->nsaddr_list[ns],
sizeof (struct sockaddr_in)),
'\0',
sizeof (struct sockaddr_in6)

View File

@@ -0,0 +1,31 @@
diff -Brup a/stdlib/msort.c b/stdlib/msort.c
--- a/stdlib/msort.c 2010-05-04 07:27:23.000000000 -0400
+++ b/stdlib/msort.c 2012-08-07 13:30:14.131765346 -0400
@@ -25,6 +25,8 @@
#include <unistd.h>
#include <memcopy.h>
#include <errno.h>
+#include <atomic.h>
+
struct msort_param
{
@@ -182,7 +184,7 @@ qsort_r (void *b, size_t n, size_t s, __
static long int phys_pages;
static int pagesize;
- if (phys_pages == 0)
+ if (pagesize == 0)
{
phys_pages = __sysconf (_SC_PHYS_PAGES);
@@ -197,6 +199,9 @@ qsort_r (void *b, size_t n, size_t s, __
a quarter of the physical memory. */
phys_pages /= 4;
+ /* Make sure phys_pages is written to memory. */
+ atomic_write_barrier ();
+
pagesize = __sysconf (_SC_PAGESIZE);
}

View File

@@ -0,0 +1,48 @@
This is a workaround for broken code which issues memcpy requests with
overlapping arguments. With this patch installed, if the file
/etc/sysconfig/32bit_ssse3_memcpy_via_32bit_ssse3_memmove exists then a
32bit memcpy call which normally would be handled by the SSSE3 memcpy
implementation would instead be handled by the 32bit SSSE3 memmove
implementation which is more tolerant of overlaps.
diff -Nrup a/sysdeps/i386/i686/multiarch/memcpy.S b/sysdeps/i386/i686/multiarch/memcpy.S
--- a/sysdeps/i386/i686/multiarch/memcpy.S 2010-05-04 05:27:23.000000000 -0600
+++ b/sysdeps/i386/i686/multiarch/memcpy.S 2012-11-20 14:19:52.890780415 -0700
@@ -21,6 +21,10 @@
#include <sysdep.h>
#include <init-arch.h>
+ .section .rodata
+L(magicfile):
+ .ascii "/etc/sysconfig/32bit_ssse3_memcpy_via_32bit_ssse3_memmove"
+
/* Define multiple versions only for the definition in lib and for
DSO. In static binaries we need memcpy before the initialization
happened. */
@@ -48,6 +52,26 @@ ENTRY(memcpy)
1: leal __memcpy_ia32@GOTOFF(%ebx), %eax
testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
jz 2f
+
+ /* This is an inlined access (magicfile, 0) syscall.
+
+ Note that it clobbers %ebx, so we have to save/restore
+ it around the syscall. */
+ mov %ebx, %edx
+ leal L(magicfile)@GOTOFF(%ebx), %ebx
+ xor %ecx, %ecx
+ movl $33, %eax
+ int $0x80
+ mov %edx, %ebx
+
+ /* If the file did not exist, then %eax will be -1..-4095 and we
+ do nothing special. */
+ cmpl $-4095, %eax
+ jae 4f
+
+ leal __memmove_ssse3@GOTOFF(%ebx), %eax
+ jmp 2f
+4:
leal __memcpy_ssse3@GOTOFF(%ebx), %eax
testl $bit_Fast_Rep_String, FEATURE_OFFSET+index_Fast_Rep_String+__cpu_features@GOTOFF(%ebx)
jz 2f

View File

@@ -0,0 +1,364 @@
diff -Nrup a/stdlib/Makefile b/stdlib/Makefile
--- a/stdlib/Makefile 2010-05-04 05:27:23.000000000 -0600
+++ b/stdlib/Makefile 2012-08-15 09:25:37.812443006 -0600
@@ -71,7 +71,7 @@ tests := tst-strtol tst-strtod testmb t
tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 tst-rand48-2 \
tst-makecontext tst-strtod4 tst-strtod5 tst-qsort2 \
tst-makecontext2 tst-strtod6 tst-unsetenv1 \
- tst-makecontext3
+ tst-makecontext3 tst-strtod-overflow
include ../Makeconfig
diff -Nrup a/stdlib/strtod_l.c b/stdlib/strtod_l.c
--- a/stdlib/strtod_l.c 2010-05-04 05:27:23.000000000 -0600
+++ b/stdlib/strtod_l.c 2012-08-15 09:34:29.550281346 -0600
@@ -62,6 +62,7 @@ extern unsigned long long int ____strtou
#include <math.h>
#include <stdlib.h>
#include <string.h>
+#include <stdint.h>
/* The gmp headers need some configuration frobs. */
#define HAVE_ALLOCA 1
@@ -176,19 +177,19 @@ extern const mp_limb_t _tens_in_limb[MAX
/* Return a floating point number of the needed type according to the given
multi-precision number after possible rounding. */
static FLOAT
-round_and_return (mp_limb_t *retval, int exponent, int negative,
+round_and_return (mp_limb_t *retval, intmax_t exponent, int negative,
mp_limb_t round_limb, mp_size_t round_bit, int more_bits)
{
if (exponent < MIN_EXP - 1)
{
- mp_size_t shift = MIN_EXP - 1 - exponent;
-
- if (shift > MANT_DIG)
+ if (exponent < MIN_EXP - 1 - MANT_DIG)
{
__set_errno (EDOM);
return 0.0;
}
+ mp_size_t shift = MIN_EXP - 1 - exponent;
+
more_bits |= (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0;
if (shift == MANT_DIG)
/* This is a special case to handle the very seldom case where
@@ -235,6 +236,9 @@ round_and_return (mp_limb_t *retval, int
__set_errno (ERANGE);
}
+ if (exponent > MAX_EXP)
+ goto overflow;
+
if ((round_limb & (((mp_limb_t) 1) << round_bit)) != 0
&& (more_bits || (retval[0] & 1) != 0
|| (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0))
@@ -260,6 +264,7 @@ round_and_return (mp_limb_t *retval, int
}
if (exponent > MAX_EXP)
+ overflow:
return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
return MPN2FLOAT (retval, exponent, negative);
@@ -273,7 +278,7 @@ round_and_return (mp_limb_t *retval, int
factor for the resulting number (see code) multiply by it. */
static const STRING_TYPE *
str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize,
- int *exponent
+ intmax_t *exponent
#ifndef USE_WIDE_CHAR
, const char *decimal, size_t decimal_len, const char *thousands
#endif
@@ -337,7 +342,7 @@ str_to_mpn (const STRING_TYPE *str, int
}
while (--digcnt > 0);
- if (*exponent > 0 && cnt + *exponent <= MAX_DIG_PER_LIMB)
+ if (*exponent > 0 && *exponent <= MAX_DIG_PER_LIMB - cnt)
{
low *= _tens_in_limb[*exponent];
start = _tens_in_limb[cnt + *exponent];
@@ -415,7 +420,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group
{
int negative; /* The sign of the number. */
MPN_VAR (num); /* MP representation of the number. */
- int exponent; /* Exponent of the number. */
+ intmax_t exponent; /* Exponent of the number. */
/* Numbers starting `0X' or `0x' have to be processed with base 16. */
int base = 10;
@@ -437,7 +442,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group
/* Points at the character following the integer and fractional digits. */
const STRING_TYPE *expp;
/* Total number of digit and number of digits in integer part. */
- int dig_no, int_no, lead_zero;
+ size_t dig_no, int_no, lead_zero;
/* Contains the last character read. */
CHAR_TYPE c;
@@ -769,7 +774,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group
are all or any is really a fractional digit will be decided
later. */
int_no = dig_no;
- lead_zero = int_no == 0 ? -1 : 0;
+ lead_zero = int_no == 0 ? (size_t) -1 : 0;
/* Read the fractional digits. A special case are the 'american
style' numbers like `16.' i.e. with decimal point but without
@@ -791,12 +796,13 @@ ____STRTOF_INTERNAL (nptr, endptr, group
(base == 16 && ({ CHAR_TYPE lo = TOLOWER (c);
lo >= L_('a') && lo <= L_('f'); })))
{
- if (c != L_('0') && lead_zero == -1)
+ if (c != L_('0') && lead_zero == (size_t) -1)
lead_zero = dig_no - int_no;
++dig_no;
c = *++cp;
}
}
+ assert (dig_no <= (uintmax_t) INTMAX_MAX);
/* Remember start of exponent (if any). */
expp = cp;
@@ -819,24 +825,80 @@ ____STRTOF_INTERNAL (nptr, endptr, group
if (c >= L_('0') && c <= L_('9'))
{
- int exp_limit;
+ intmax_t exp_limit;
/* Get the exponent limit. */
if (base == 16)
- exp_limit = (exp_negative ?
- -MIN_EXP + MANT_DIG + 4 * int_no :
- MAX_EXP - 4 * int_no + 4 * lead_zero + 3);
+ {
+ if (exp_negative)
+ {
+ assert (int_no <= (uintmax_t) (INTMAX_MAX
+ + MIN_EXP - MANT_DIG) / 4);
+ exp_limit = -MIN_EXP + MANT_DIG + 4 * (intmax_t) int_no;
+ }
+ else
+ {
+ if (int_no)
+ {
+ assert (lead_zero == 0
+ && int_no <= (uintmax_t) INTMAX_MAX / 4);
+ exp_limit = MAX_EXP - 4 * (intmax_t) int_no + 3;
+ }
+ else if (lead_zero == (size_t) -1)
+ {
+ /* The number is zero and this limit is
+ arbitrary. */
+ exp_limit = MAX_EXP + 3;
+ }
+ else
+ {
+ assert (lead_zero
+ <= (uintmax_t) (INTMAX_MAX - MAX_EXP - 3) / 4);
+ exp_limit = (MAX_EXP
+ + 4 * (intmax_t) lead_zero
+ + 3);
+ }
+ }
+ }
else
- exp_limit = (exp_negative ?
- -MIN_10_EXP + MANT_DIG + int_no :
- MAX_10_EXP - int_no + lead_zero + 1);
+ {
+ if (exp_negative)
+ {
+ assert (int_no
+ <= (uintmax_t) (INTMAX_MAX + MIN_10_EXP - MANT_DIG));
+ exp_limit = -MIN_10_EXP + MANT_DIG + (intmax_t) int_no;
+ }
+ else
+ {
+ if (int_no)
+ {
+ assert (lead_zero == 0
+ && int_no <= (uintmax_t) INTMAX_MAX);
+ exp_limit = MAX_10_EXP - (intmax_t) int_no + 1;
+ }
+ else if (lead_zero == (size_t) -1)
+ {
+ /* The number is zero and this limit is
+ arbitrary. */
+ exp_limit = MAX_10_EXP + 1;
+ }
+ else
+ {
+ assert (lead_zero
+ <= (uintmax_t) (INTMAX_MAX - MAX_10_EXP - 1));
+ exp_limit = MAX_10_EXP + (intmax_t) lead_zero + 1;
+ }
+ }
+ }
+
+ if (exp_limit < 0)
+ exp_limit = 0;
do
{
- exponent *= 10;
- exponent += c - L_('0');
-
- if (__builtin_expect (exponent > exp_limit, 0))
+ if (__builtin_expect ((exponent > exp_limit / 10
+ || (exponent == exp_limit / 10
+ && c - L_('0') > exp_limit % 10)), 0))
/* The exponent is too large/small to represent a valid
number. */
{
@@ -845,7 +907,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group
/* We have to take care for special situation: a joker
might have written "0.0e100000" which is in fact
zero. */
- if (lead_zero == -1)
+ if (lead_zero == (size_t) -1)
result = negative ? -0.0 : 0.0;
else
{
@@ -864,6 +926,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group
/* NOTREACHED */
}
+ exponent *= 10;
+ exponent += c - L_('0');
+
c = *++cp;
}
while (c >= L_('0') && c <= L_('9'));
@@ -932,7 +997,14 @@ ____STRTOF_INTERNAL (nptr, endptr, group
}
#endif
startp += lead_zero + decimal_len;
- exponent -= base == 16 ? 4 * lead_zero : lead_zero;
+ assert (lead_zero <= (base == 16
+ ? (uintmax_t) INTMAX_MAX / 4
+ : (uintmax_t) INTMAX_MAX));
+ assert (lead_zero <= (base == 16
+ ? ((uintmax_t) exponent
+ - (uintmax_t) INTMAX_MIN) / 4
+ : ((uintmax_t) exponent - (uintmax_t) INTMAX_MIN)));
+ exponent -= base == 16 ? 4 * (intmax_t) lead_zero : (intmax_t) lead_zero;
dig_no -= lead_zero;
}
@@ -974,7 +1046,10 @@ ____STRTOF_INTERNAL (nptr, endptr, group
}
/* Adjust the exponent for the bits we are shifting in. */
- exponent += bits - 1 + (int_no - 1) * 4;
+ assert (int_no <= (uintmax_t) (exponent < 0
+ ? (INTMAX_MAX - bits + 1) / 4
+ : (INTMAX_MAX - exponent - bits + 1) / 4));
+ exponent += bits - 1 + ((intmax_t) int_no - 1) * 4;
while (--dig_no > 0 && idx >= 0)
{
@@ -1014,13 +1089,15 @@ ____STRTOF_INTERNAL (nptr, endptr, group
really integer digits or belong to the fractional part; i.e. we normalize
123e-2 to 1.23. */
{
- register int incr = (exponent < 0 ? MAX (-int_no, exponent)
- : MIN (dig_no - int_no, exponent));
+ register intmax_t incr = (exponent < 0
+ ? MAX (-(intmax_t) int_no, exponent)
+ : MIN ((intmax_t) dig_no - (intmax_t) int_no,
+ exponent));
int_no += incr;
exponent -= incr;
}
- if (__builtin_expect (int_no + exponent > MAX_10_EXP + 1, 0))
+ if (__builtin_expect (exponent > MAX_10_EXP + 1 - (intmax_t) int_no, 0))
{
__set_errno (ERANGE);
return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
@@ -1205,7 +1282,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group
digits we should have enough bits for the result. The remaining
decimal digits give us the information that more bits are following.
This can be used while rounding. (Two added as a safety margin.) */
- if (dig_no - int_no > (MANT_DIG - bits + 2) / 3 + 2)
+ if ((intmax_t) dig_no > (intmax_t) int_no + (MANT_DIG - bits + 2) / 3 + 2)
{
dig_no = int_no + (MANT_DIG - bits + 2) / 3 + 2;
more_bits = 1;
@@ -1213,7 +1290,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group
else
more_bits = 0;
- neg_exp = dig_no - int_no - exponent;
+ neg_exp = (intmax_t) dig_no - (intmax_t) int_no - exponent;
/* Construct the denominator. */
densize = 0;
@@ -1491,7 +1568,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group
register int i;
(void) __mpn_lshift (&retval[used
/ BITS_PER_MP_LIMB],
- retval, RETURN_LIMB_SIZE,
+ retval,
+ (RETURN_LIMB_SIZE
+ - used / BITS_PER_MP_LIMB),
used % BITS_PER_MP_LIMB);
for (i = used / BITS_PER_MP_LIMB - 1; i >= 0; --i)
retval[i] = 0;
diff -Nrup a/stdlib/tst-strtod-overflow.c b/stdlib/tst-strtod-overflow.c
--- a/stdlib/tst-strtod-overflow.c 1969-12-31 17:00:00.000000000 -0700
+++ b/stdlib/tst-strtod-overflow.c 2012-08-15 09:25:01.098592764 -0600
@@ -0,0 +1,48 @@
+/* Test for integer/buffer overflow in strtod.
+ Copyright (C) 2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define EXPONENT "e-2147483649"
+#define SIZE 214748364
+
+static int
+do_test (void)
+{
+ char *p = malloc (1 + SIZE + sizeof (EXPONENT));
+ if (p == NULL)
+ {
+ puts ("malloc failed, cannot test for overflow");
+ return 0;
+ }
+ p[0] = '1';
+ memset (p + 1, '0', SIZE);
+ memcpy (p + 1 + SIZE, EXPONENT, sizeof (EXPONENT));
+ double d = strtod (p, NULL);
+ if (d != 0)
+ {
+ printf ("strtod returned wrong value: %a\n", d);
+ return 1;
+ }
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"

View File

@@ -0,0 +1,88 @@
commit 4f031072a5055abd83717820b59efdaa463d5853
Author: Ulrich Drepper <drepper@gmail.com>
Date: Sat May 28 16:59:30 2011 -0400
Handle failure of _nl_explode_name in all cases
2011-05-28 Ulrich Drepper <drepper@gmail.com>
* locale/findlocale.c (_nl_find_locale): Return right away if
_nl_explode_name failed.
* locale/programs/locarchive.c (add_locale_to_archive): Likewise.
diff --git a/locale/findlocale.c b/locale/findlocale.c
index 6b88c96..2fec9a7 100644
--- a/locale/findlocale.c
+++ b/locale/findlocale.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-2001, 2002, 2003, 2006, 2010 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2003, 2006, 2010, 2011 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -140,6 +140,9 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
*/
mask = _nl_explode_name (loc_name, &language, &modifier, &territory,
&codeset, &normalized_codeset);
+ if (mask == -1)
+ /* Memory allocate problem. */
+ return NULL;
/* If exactly this locale was already asked for we have an entry with
the complete name. */
diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c
index 85ba77d..e95bcf1 100644
--- a/locale/programs/locarchive.c
+++ b/locale/programs/locarchive.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002,2003,2005,2007,2009,2011 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -1079,6 +1079,8 @@ add_locale_to_archive (ah, name, data, replace)
int mask = _nl_explode_name (strdupa (name),
&language, &modifier, &territory,
&codeset, &normalized_codeset);
+ if (mask == -1)
+ return -1;
if (mask & XPG_NORM_CODESET)
/* This name contains a codeset in unnormalized form.
@@ -1128,6 +1130,7 @@ add_locale_to_archive (ah, name, data, replace)
/* Now read the locale.alias files looking for lines whose
right hand side matches our name after normalization. */
+ int result = 0;
if (alias_file != NULL)
{
FILE *fp;
@@ -1207,6 +1210,11 @@ add_locale_to_archive (ah, name, data, replace)
&rhs_territory,
&rhs_codeset,
&rhs_normalized_codeset);
+ if (rhs_mask == 1)
+ {
+ result = -1;
+ goto out;
+ }
if (!strcmp (language, rhs_language)
&& ((rhs_mask & XPG_CODESET)
/* He has a codeset, it must match normalized. */
@@ -1240,6 +1248,7 @@ add_locale_to_archive (ah, name, data, replace)
}
}
+ out:
fclose (fp);
}
@@ -1248,7 +1257,7 @@ add_locale_to_archive (ah, name, data, replace)
if (mask & XPG_NORM_CODESET)
free ((char *) normalized_codeset);
- return 0;
+ return result;
}

View File

@@ -0,0 +1,195 @@
diff -Nrup a/intl/Makefile b/intl/Makefile
--- a/intl/Makefile 2010-05-04 05:27:23.000000000 -0600
+++ b/intl/Makefile 2012-08-17 14:40:00.457226629 -0600
@@ -74,6 +74,16 @@ ifneq (no,$(PERL))
tests: $(objpfx)mtrace-tst-gettext
endif
endif
+
+# Multiple tests use this data. Create it once to avoid racing and
+# spurious test failures.
+codeset_mo = $(objpfx)domaindir/de_DE/LC_MESSAGES/codeset.mo
+
+$(codeset_mo):
+ $(make-target-directory)
+ msgfmt -o $@T tstcodeset.po
+ mv -f $@T $@
+
$(objpfx)mtrace-tst-gettext: $(objpfx)tst-gettext.out
$(common-objpfx)malloc/mtrace $(objpfx)tst-gettext.mtrace > $@
$(objpfx)tst-gettext.out: tst-gettext.sh $(objpfx)tst-gettext
@@ -83,16 +93,14 @@ $(objpfx)tst-translit.out: tst-translit.
$(SHELL) -e $< $(common-objpfx) $(common-objpfx)intl/
$(objpfx)tst-gettext2.out: tst-gettext2.sh $(objpfx)tst-gettext2
$(SHELL) -e $< $(common-objpfx) $(common-objpfx)intl/
-$(objpfx)tst-codeset.out: tst-codeset.sh $(objpfx)tst-codeset
- $(SHELL) -e $< $(common-objpfx) $(common-objpfx)intl/
-$(objpfx)tst-gettext3.out: tst-gettext3.sh $(objpfx)tst-gettext3
- $(SHELL) -e $< $(common-objpfx) $(common-objpfx)intl/
$(objpfx)tst-gettext4.out: tst-gettext4.sh $(objpfx)tst-gettext4
$(SHELL) -e $< $(common-objpfx) '$(run-program-prefix)' $(common-objpfx)intl/
-$(objpfx)tst-gettext5.out: tst-gettext5.sh $(objpfx)tst-gettext5
- $(SHELL) -e $< $(common-objpfx) '$(run-program-prefix)' $(common-objpfx)intl/
$(objpfx)tst-gettext6.out: tst-gettext6.sh $(objpfx)tst-gettext6
$(SHELL) -e $< $(common-objpfx) '$(run-program-prefix)' $(common-objpfx)intl/
+
+$(objpfx)tst-codeset.out: $(codeset_mo)
+$(objpfx)tst-gettext3.out: $(codeset_mo)
+$(objpfx)tst-gettext5.out: $(codeset_mo)
endif
endif
@@ -109,6 +117,11 @@ CFLAGS-tst-gettext4.c = -DOBJPFX=\"$(obj
CFLAGS-tst-gettext5.c = -DOBJPFX=\"$(objpfx)\"
CFLAGS-tst-gettext6.c = -DOBJPFX=\"$(objpfx)\"
+LOCPATH-ENV = LOCPATH=$(common-objpfx)localedata
+tst-codeset-ENV = $(LOCPATH-ENV)
+tst-gettext3-ENV = $(LOCPATH-ENV)
+tst-gettext5-ENV = $(LOCPATH-ENV)
+
ifeq ($(have-thread-library),yes)
ifeq (yes,$(build-shared))
$(addprefix $(objpfx),$(multithread-test-srcs)): $(shared-thread-library)
diff -Nrup a/intl/tst-codeset.sh b/intl/tst-codeset.sh
--- a/intl/tst-codeset.sh 2010-05-04 05:27:23.000000000 -0600
+++ b/intl/tst-codeset.sh 1969-12-31 17:00:00.000000000 -0700
@@ -1,43 +0,0 @@
-#! /bin/sh
-# Test of bind_textdomain_codeset.
-# Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-#
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
-
-common_objpfx=$1
-objpfx=$2
-
-LC_ALL=C
-export LC_ALL
-
-# Generate the test data.
-msgfmt -o ${objpfx}codeset.mo.$$ tstcodeset.po || exit
-# Create the domain directories.
-mkdir -p ${objpfx}domaindir/de_DE/LC_MESSAGES
-# Populate them.
-mv -f ${objpfx}codeset.mo.$$ ${objpfx}domaindir/de_DE/LC_MESSAGES/codeset.mo
-
-GCONV_PATH=${common_objpfx}iconvdata
-export GCONV_PATH
-LOCPATH=${common_objpfx}localedata
-export LOCPATH
-
-${common_objpfx}elf/ld.so --library-path $common_objpfx \
-${objpfx}tst-codeset > ${objpfx}tst-codeset.out
-
-exit $?
diff -Nrup a/intl/tst-gettext3.sh b/intl/tst-gettext3.sh
--- a/intl/tst-gettext3.sh 2010-05-04 05:27:23.000000000 -0600
+++ b/intl/tst-gettext3.sh 1969-12-31 17:00:00.000000000 -0700
@@ -1,44 +0,0 @@
-#! /bin/sh
-# Test that the gettext() results come out in the correct encoding for
-# locales that differ only in their encoding.
-# Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-#
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
-
-common_objpfx=$1
-objpfx=$2
-
-LC_ALL=C
-export LC_ALL
-
-# Generate the test data.
-msgfmt -o ${objpfx}codeset.mo.$$ tstcodeset.po || exit
-# Create the domain directories.
-mkdir -p ${objpfx}domaindir/de_DE/LC_MESSAGES
-# Populate them.
-mv -f ${objpfx}codeset.mo.$$ ${objpfx}domaindir/de_DE/LC_MESSAGES/codeset.mo
-
-GCONV_PATH=${common_objpfx}iconvdata
-export GCONV_PATH
-LOCPATH=${common_objpfx}localedata
-export LOCPATH
-
-${common_objpfx}elf/ld.so --library-path $common_objpfx \
-${objpfx}tst-gettext3 > ${objpfx}tst-gettext3.out
-
-exit $?
diff -Nrup a/intl/tst-gettext5.sh b/intl/tst-gettext5.sh
--- a/intl/tst-gettext5.sh 2010-05-04 05:27:23.000000000 -0600
+++ b/intl/tst-gettext5.sh 1969-12-31 17:00:00.000000000 -0700
@@ -1,43 +0,0 @@
-#! /bin/sh
-# Test that gettext() in multithreaded applications works correctly if
-# different threads operate in different locales referring to the same
-# catalog file but with different encodings.
-# Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-#
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
-
-common_objpfx=$1
-run_program_prefix=$2
-objpfx=$3
-
-LC_ALL=C
-export LC_ALL
-
-# Create the domain directories.
-mkdir -p ${objpfx}domaindir/de_DE/LC_MESSAGES
-# Populate them.
-msgfmt -o ${objpfx}domaindir/de_DE/LC_MESSAGES/codeset.mo tstcodeset.po
-
-GCONV_PATH=${common_objpfx}iconvdata
-export GCONV_PATH
-LOCPATH=${common_objpfx}localedata
-export LOCPATH
-
-${run_program_prefix} ${objpfx}tst-gettext5 > ${objpfx}tst-gettext5.out
-
-exit $?

View File

@@ -0,0 +1,343 @@
diff -Nrup a/sysdeps/x86_64/fpu/e_expf.S b/sysdeps/x86_64/fpu/e_expf.S
--- a/sysdeps/x86_64/fpu/e_expf.S 1969-12-31 17:00:00.000000000 -0700
+++ b/sysdeps/x86_64/fpu/e_expf.S 2012-08-20 09:47:15.551971545 -0600
@@ -0,0 +1,339 @@
+/* Optimized __ieee754_expf function.
+ Copyright (C) 2012 Free Software Foundation, Inc.
+ Contributed by Intel Corporation.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+/* Short algorithm description:
+ *
+ * Let K = 64 (table size).
+ * e^x = 2^(x/log(2)) = 2^n * T[j] * (1 + P(y))
+ * where
+ * x = m*log(2)/K + y, y in [0.0..log(2)/K]
+ * m = n*K + j, m,n,j - signed integer, j in [0..K-1]
+ * values of 2^(j/K) are tabulated as T[j].
+ *
+ * P(y) is a minimax polynomial approximation of expf(x)-1
+ * on small interval [0.0..log(2)/K].
+ *
+ * P(y) = P3*y*y*y*y + P2*y*y*y + P1*y*y + P0*y, calculated as
+ * z = y*y; P(y) = (P3*z + P1)*z + (P2*z + P0)*y
+ *
+ * Special cases:
+ * expf(NaN) = NaN
+ * expf(+INF) = +INF
+ * expf(-INF) = 0
+ * expf(x) = 1 for subnormals
+ * for finite argument, only expf(0)=1 is exact
+ * expf(x) overflows if x>88.7228317260742190
+ * expf(x) underflows if x<-103.972076416015620
+ */
+
+ .text
+ENTRY(__ieee754_expf)
+ /* Input: single precision x in %xmm0 */
+ cvtss2sd %xmm0, %xmm1 /* Convert x to double precision */
+ movd %xmm0, %ecx /* Copy x */
+ movsd L(DP_KLN2)(%rip), %xmm2 /* DP K/log(2) */
+ movsd L(DP_P2)(%rip), %xmm3 /* DP P2 */
+ movl %ecx, %eax /* x */
+ mulsd %xmm1, %xmm2 /* DP x*K/log(2) */
+ andl $0x7fffffff, %ecx /* |x| */
+ lea L(DP_T)(%rip), %rsi /* address of table T[j] */
+ cmpl $0x42ad496b, %ecx /* |x|<125*log(2) ? */
+ movsd L(DP_P3)(%rip), %xmm4 /* DP P3 */
+ addsd L(DP_RS)(%rip), %xmm2 /* DP x*K/log(2)+RS */
+ jae L(special_paths)
+
+ /* Here if |x|<125*log(2) */
+ cmpl $0x31800000, %ecx /* |x|<2^(-28) ? */
+ jb L(small_arg)
+
+ /* Main path: here if 2^(-28)<=|x|<125*log(2) */
+ cvtsd2ss %xmm2, %xmm2 /* SP x*K/log(2)+RS */
+ movd %xmm2, %eax /* bits of n*K+j with trash */
+ subss L(SP_RS)(%rip), %xmm2 /* SP t=round(x*K/log(2)) */
+ movl %eax, %edx /* n*K+j with trash */
+ cvtss2sd %xmm2, %xmm2 /* DP t */
+ andl $0x3f, %eax /* bits of j */
+ mulsd L(DP_NLN2K)(%rip), %xmm2/* DP -t*log(2)/K */
+ andl $0xffffffc0, %edx /* bits of n */
+#ifdef __AVX__
+ vaddsd %xmm1, %xmm2, %xmm0 /* DP y=x-t*log(2)/K */
+ vmulsd %xmm0, %xmm0, %xmm2 /* DP z=y*y */
+#else
+ addsd %xmm1, %xmm2 /* DP y=x-t*log(2)/K */
+ movaps %xmm2, %xmm0 /* DP y */
+ mulsd %xmm2, %xmm2 /* DP z=y*y */
+#endif
+ mulsd %xmm2, %xmm4 /* DP P3*z */
+ addl $0x1fc0, %edx /* bits of n + SP exponent bias */
+ mulsd %xmm2, %xmm3 /* DP P2*z */
+ shll $17, %edx /* SP 2^n */
+ addsd L(DP_P1)(%rip), %xmm4 /* DP P3*z+P1 */
+ addsd L(DP_P0)(%rip), %xmm3 /* DP P2*z+P0 */
+ movd %edx, %xmm1 /* SP 2^n */
+ mulsd %xmm2, %xmm4 /* DP (P3*z+P1)*z */
+ mulsd %xmm3, %xmm0 /* DP (P2*z+P0)*y */
+ addsd %xmm4, %xmm0 /* DP P(y) */
+ mulsd (%rsi,%rax,8), %xmm0 /* DP P(y)*T[j] */
+ addsd (%rsi,%rax,8), %xmm0 /* DP T[j]*(P(y)+1) */
+ cvtsd2ss %xmm0, %xmm0 /* SP T[j]*(P(y)+1) */
+ mulss %xmm1, %xmm0 /* SP result=2^n*(T[j]*(P(y)+1)) */
+ ret
+
+ .p2align 4
+L(small_arg):
+ /* Here if 0<=|x|<2^(-28) */
+ addss L(SP_ONE)(%rip), %xmm0 /* 1.0 + x */
+ /* Return 1.0 with inexact raised, except for x==0 */
+ ret
+
+ .p2align 4
+L(special_paths):
+ /* Here if 125*log(2)<=|x| */
+ shrl $31, %eax /* Get sign bit of x, and depending on it: */
+ lea L(SP_RANGE)(%rip), %rdx /* load over/underflow bound */
+ cmpl (%rdx,%rax,4), %ecx /* |x|<under/overflow bound ? */
+ jbe L(near_under_or_overflow)
+
+ /* Here if |x|>under/overflow bound */
+ cmpl $0x7f800000, %ecx /* |x| is finite ? */
+ jae L(arg_inf_or_nan)
+
+ /* Here if |x|>under/overflow bound, and x is finite */
+ testq %rax, %rax /* sign of x nonzero ? */
+ je L(res_overflow)
+
+ /* Here if -inf<x<underflow bound (x<0) */
+ movss L(SP_SMALL)(%rip), %xmm0/* load small value 2^(-100) */
+ mulss %xmm0, %xmm0 /* Return underflowed result (zero or subnormal) */
+ ret
+
+ .p2align 4
+L(res_overflow):
+ /* Here if overflow bound<x<inf (x>0) */
+ movss L(SP_LARGE)(%rip), %xmm0/* load large value 2^100 */
+ mulss %xmm0, %xmm0 /* Return overflowed result (Inf or max normal) */
+ ret
+
+ .p2align 4
+L(arg_inf_or_nan):
+ /* Here if |x| is Inf or NAN */
+ jne L(arg_nan) /* |x| is Inf ? */
+
+ /* Here if |x| is Inf */
+ lea L(SP_INF_0)(%rip), %rdx /* depending on sign of x: */
+ movss (%rdx,%rax,4), %xmm0 /* return zero or Inf */
+ ret
+
+ .p2align 4
+L(arg_nan):
+ /* Here if |x| is NaN */
+ addss %xmm0, %xmm0 /* Return x+x (raise invalid) */
+ ret
+
+ .p2align 4
+L(near_under_or_overflow):
+ /* Here if 125*log(2)<=|x|<under/overflow bound */
+ cvtsd2ss %xmm2, %xmm2 /* SP x*K/log(2)+RS */
+ movd %xmm2, %eax /* bits of n*K+j with trash */
+ subss L(SP_RS)(%rip), %xmm2 /* SP t=round(x*K/log(2)) */
+ movl %eax, %edx /* n*K+j with trash */
+ cvtss2sd %xmm2, %xmm2 /* DP t */
+ andl $0x3f, %eax /* bits of j */
+ mulsd L(DP_NLN2K)(%rip), %xmm2/* DP -t*log(2)/K */
+ andl $0xffffffc0, %edx /* bits of n */
+#ifdef __AVX__
+ vaddsd %xmm1, %xmm2, %xmm0 /* DP y=x-t*log(2)/K */
+ vmulsd %xmm0, %xmm0, %xmm2 /* DP z=y*y */
+#else
+ addsd %xmm1, %xmm2 /* DP y=x-t*log(2)/K */
+ movaps %xmm2, %xmm0 /* DP y */
+ mulsd %xmm2, %xmm2 /* DP z=y*y */
+#endif
+ mulsd %xmm2, %xmm4 /* DP P3*z */
+ addl $0xffc0, %edx /* bits of n + DP exponent bias */
+ mulsd %xmm2, %xmm3 /* DP P2*z */
+ shlq $46, %rdx /* DP 2^n */
+ addsd L(DP_P1)(%rip), %xmm4 /* DP P3*z+P1 */
+ addsd L(DP_P0)(%rip), %xmm3 /* DP P2*z+P0 */
+ movd %rdx, %xmm1 /* DP 2^n */
+ mulsd %xmm2, %xmm4 /* DP (P3*z+P1)*z */
+ mulsd %xmm3, %xmm0 /* DP (P2*z+P0)*y */
+ addsd %xmm4, %xmm0 /* DP P(y) */
+ mulsd (%rsi,%rax,8), %xmm0 /* DP P(y)*T[j] */
+ addsd (%rsi,%rax,8), %xmm0 /* DP T[j]*(P(y)+1) */
+ mulsd %xmm1, %xmm0 /* DP result=2^n*(T[j]*(P(y)+1)) */
+ cvtsd2ss %xmm0, %xmm0 /* convert result to single precision */
+ ret
+END(__ieee754_expf)
+
+ .section .rodata, "a"
+ .p2align 3
+L(DP_T): /* table of double precision values 2^(j/K) for j=[0..K-1] */
+ .long 0x00000000, 0x3ff00000
+ .long 0x3e778061, 0x3ff02c9a
+ .long 0xd3158574, 0x3ff059b0
+ .long 0x18759bc8, 0x3ff08745
+ .long 0x6cf9890f, 0x3ff0b558
+ .long 0x32d3d1a2, 0x3ff0e3ec
+ .long 0xd0125b51, 0x3ff11301
+ .long 0xaea92de0, 0x3ff1429a
+ .long 0x3c7d517b, 0x3ff172b8
+ .long 0xeb6fcb75, 0x3ff1a35b
+ .long 0x3168b9aa, 0x3ff1d487
+ .long 0x88628cd6, 0x3ff2063b
+ .long 0x6e756238, 0x3ff2387a
+ .long 0x65e27cdd, 0x3ff26b45
+ .long 0xf51fdee1, 0x3ff29e9d
+ .long 0xa6e4030b, 0x3ff2d285
+ .long 0x0a31b715, 0x3ff306fe
+ .long 0xb26416ff, 0x3ff33c08
+ .long 0x373aa9cb, 0x3ff371a7
+ .long 0x34e59ff7, 0x3ff3a7db
+ .long 0x4c123422, 0x3ff3dea6
+ .long 0x21f72e2a, 0x3ff4160a
+ .long 0x6061892d, 0x3ff44e08
+ .long 0xb5c13cd0, 0x3ff486a2
+ .long 0xd5362a27, 0x3ff4bfda
+ .long 0x769d2ca7, 0x3ff4f9b2
+ .long 0x569d4f82, 0x3ff5342b
+ .long 0x36b527da, 0x3ff56f47
+ .long 0xdd485429, 0x3ff5ab07
+ .long 0x15ad2148, 0x3ff5e76f
+ .long 0xb03a5585, 0x3ff6247e
+ .long 0x82552225, 0x3ff66238
+ .long 0x667f3bcd, 0x3ff6a09e
+ .long 0x3c651a2f, 0x3ff6dfb2
+ .long 0xe8ec5f74, 0x3ff71f75
+ .long 0x564267c9, 0x3ff75feb
+ .long 0x73eb0187, 0x3ff7a114
+ .long 0x36cf4e62, 0x3ff7e2f3
+ .long 0x994cce13, 0x3ff82589
+ .long 0x9b4492ed, 0x3ff868d9
+ .long 0x422aa0db, 0x3ff8ace5
+ .long 0x99157736, 0x3ff8f1ae
+ .long 0xb0cdc5e5, 0x3ff93737
+ .long 0x9fde4e50, 0x3ff97d82
+ .long 0x82a3f090, 0x3ff9c491
+ .long 0x7b5de565, 0x3ffa0c66
+ .long 0xb23e255d, 0x3ffa5503
+ .long 0x5579fdbf, 0x3ffa9e6b
+ .long 0x995ad3ad, 0x3ffae89f
+ .long 0xb84f15fb, 0x3ffb33a2
+ .long 0xf2fb5e47, 0x3ffb7f76
+ .long 0x904bc1d2, 0x3ffbcc1e
+ .long 0xdd85529c, 0x3ffc199b
+ .long 0x2e57d14b, 0x3ffc67f1
+ .long 0xdcef9069, 0x3ffcb720
+ .long 0x4a07897c, 0x3ffd072d
+ .long 0xdcfba487, 0x3ffd5818
+ .long 0x03db3285, 0x3ffda9e6
+ .long 0x337b9b5f, 0x3ffdfc97
+ .long 0xe78b3ff6, 0x3ffe502e
+ .long 0xa2a490da, 0x3ffea4af
+ .long 0xee615a27, 0x3ffefa1b
+ .long 0x5b6e4540, 0x3fff5076
+ .long 0x819e90d8, 0x3fffa7c1
+ .type L(DP_T), @object
+ ASM_SIZE_DIRECTIVE(L(DP_T))
+
+ .section .rodata.cst8,"aM",@progbits,8
+ .p2align 3
+L(DP_KLN2): /* double precision K/log(2) */
+ .long 0x652b82fe, 0x40571547
+ .type L(DP_KLN2), @object
+ ASM_SIZE_DIRECTIVE(L(DP_KLN2))
+
+ .p2align 3
+L(DP_NLN2K): /* double precision -log(2)/K */
+ .long 0xfefa39ef, 0xbf862e42
+ .type L(DP_NLN2K), @object
+ ASM_SIZE_DIRECTIVE(L(DP_NLN2K))
+
+ .p2align 3
+L(DP_RS): /* double precision 2^23+2^22 */
+ .long 0x00000000, 0x41680000
+ .type L(DP_RS), @object
+ ASM_SIZE_DIRECTIVE(L(DP_RS))
+
+ .p2align 3
+L(DP_P3): /* double precision polynomial coefficient P3 */
+ .long 0xeb78fa85, 0x3fa56420
+ .type L(DP_P3), @object
+ ASM_SIZE_DIRECTIVE(L(DP_P3))
+
+ .p2align 3
+L(DP_P1): /* double precision polynomial coefficient P1 */
+ .long 0x008d6118, 0x3fe00000
+ .type L(DP_P1), @object
+ ASM_SIZE_DIRECTIVE(L(DP_P1))
+
+ .p2align 3
+L(DP_P2): /* double precision polynomial coefficient P2 */
+ .long 0xda752d4f, 0x3fc55550
+ .type L(DP_P2), @object
+ ASM_SIZE_DIRECTIVE(L(DP_P2))
+
+ .p2align 3
+L(DP_P0): /* double precision polynomial coefficient P0 */
+ .long 0xffffe7c6, 0x3fefffff
+ .type L(DP_P0), @object
+ ASM_SIZE_DIRECTIVE(L(DP_P0))
+
+ .p2align 2
+L(SP_RANGE): /* single precision overflow/underflow bounds */
+ .long 0x42b17217 /* if x>this bound, then result overflows */
+ .long 0x42cff1b4 /* if x<this bound, then result underflows */
+ .type L(SP_RANGE), @object
+ ASM_SIZE_DIRECTIVE(L(SP_RANGE))
+
+ .p2align 2
+L(SP_INF_0):
+ .long 0x7f800000 /* single precision Inf */
+ .long 0 /* single precision zero */
+ .type L(SP_INF_0), @object
+ ASM_SIZE_DIRECTIVE(L(SP_INF_0))
+
+ .section .rodata.cst4,"aM",@progbits,4
+ .p2align 2
+L(SP_RS): /* single precision 2^23+2^22 */
+ .long 0x4b400000
+ .type L(SP_RS), @object
+ ASM_SIZE_DIRECTIVE(L(SP_RS))
+
+ .p2align 2
+L(SP_SMALL): /* single precision small value 2^(-100) */
+ .long 0x0d800000
+ .type L(SP_SMALL), @object
+ ASM_SIZE_DIRECTIVE(L(SP_SMALL))
+
+ .p2align 2
+L(SP_LARGE): /* single precision large value 2^100 */
+ .long 0x71800000
+ .type L(SP_LARGE), @object
+ ASM_SIZE_DIRECTIVE(L(SP_LARGE))
+
+ .p2align 2
+L(SP_ONE): /* single precision 1.0 */
+ .long 0x3f800000
+ .type L(SP_ONE), @object
+ ASM_SIZE_DIRECTIVE(L(SP_ONE))
+
+strong_alias (__ieee754_expf, __expf_finite)

View File

@@ -0,0 +1,105 @@
From libc-alpha-return-31329-listarch-libc-alpha=sources dot redhat dot com at sourceware dot org Wed Jul 11 11:36:39 2012
Return-Path: <libc-alpha-return-31329-listarch-libc-alpha=sources dot redhat dot com at sourceware dot org>
Delivered-To: listarch-libc-alpha at sources dot redhat dot com
Received: (qmail 15677 invoked by alias); 11 Jul 2012 11:36:39 -0000
Received: (qmail 15654 invoked by uid 22791); 11 Jul 2012 11:36:37 -0000
X-SWARE-Spam-Status: No, hits=-4.3 required=5.0
tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KHOP_RCVD_TRUST,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE
X-Spam-Check-By: sourceware.org
Date: Wed, 11 Jul 2012 21:06:06 +0930
From: Alan Modra <amodra at gmail dot com>
To: libc-alpha at sourceware dot org
Cc: rsa at linux dot vnet dot ibm dot com
Subject: powerpc pthread_once bug fix
Message-ID: <20120711113606.GM3117@bubble.grove.modra.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
Mailing-List: contact libc-alpha-help at sourceware dot org; run by ezmlm
Precedence: bulk
List-Id: <libc-alpha.sourceware.org>
List-Subscribe: <mailto:libc-alpha-subscribe at sourceware dot org>
List-Archive: <http://sourceware.org/ml/libc-alpha/>
List-Post: <mailto:libc-alpha at sourceware dot org>
List-Help: <mailto:libc-alpha-help at sourceware dot org>, <http://sourceware dot org/ml/#faqs>
Sender: libc-alpha-owner at sourceware dot org
Delivered-To: mailing list libc-alpha at sourceware dot org
This fixes some bugs in the powerpc pthread_once code. Ref
gcc.gnu.org/bugzilla/show_bug.cgi?id=52839#c10
Release barriers are needed to ensure any memory written by
init_routine is seen by other threads before *once_control changes.
In the case of clear_once_control we need to flush any partially
written state.
2012-06-28 Alan Modra <amodra@gmail.com>
* sysdeps/unix/sysv/linux/powerpc/pthread_once.c (__pthread_once):
Add release barrier before setting once_control to say
initialisation is done. Add hints on lwarx. Use macro in
place of isync.
(clear_once_control): Add release barrier.
[ This was slightly edited -- the constraint for operand 0 in the last asm was changed
from "=&r" to "=&b" as using r0 in that context results in a load immediate 1 into
the target rather than incrementing the target. ]
diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c b/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c
index 4e3d7bd..bb1ebf2 100644
--- a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c
+++ b/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c
@@ -28,6 +28,7 @@ clear_once_control (void *arg)
{
pthread_once_t *once_control = (pthread_once_t *) arg;
+ __asm __volatile (__lll_rel_instr);
*once_control = 0;
lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE);
}
@@ -47,15 +48,15 @@ __pthread_once (pthread_once_t *once_control, void (*init_routine) (void))
oldval = *once_control;
if ((oldval & 2) == 0)
*once_control = newval;
- Do this atomically.
+ Do this atomically with an acquire barrier.
*/
newval = __fork_generation | 1;
- __asm __volatile ("1: lwarx %0,0,%3\n"
+ __asm __volatile ("1: lwarx %0,0,%3" MUTEX_HINT_ACQ "\n"
" andi. %1,%0,2\n"
" bne 2f\n"
" stwcx. %4,0,%3\n"
" bne 1b\n"
- "2: isync"
+ "2: " __lll_acq_instr
: "=&r" (oldval), "=&r" (tmp), "=m" (*once_control)
: "r" (once_control), "r" (newval), "m" (*once_control)
: "cr0");
@@ -87,8 +88,18 @@ __pthread_once (pthread_once_t *once_control, void (*init_routine) (void))
pthread_cleanup_pop (0);
- /* Add one to *once_control to take the bottom 2 bits from 01 to 10. */
- atomic_increment (once_control);
+ /* Add one to *once_control to take the bottom 2 bits from 01 to 10.
+ A release barrier is needed to ensure memory written by init_routine
+ is seen in other threads before *once_control changes. */
+ int tmp;
+ __asm __volatile (__lll_rel_instr "\n"
+ "1: lwarx %0,0,%2" MUTEX_HINT_REL "\n"
+ " addi %0,%0,1\n"
+ " stwcx. %0,0,%2\n"
+ " bne- 1b"
+ : "=&b" (tmp), "=m" (*once_control)
+ : "r" (once_control), "m" (*once_control)
+ : "cr0");
/* Wake up all other threads. */
lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE);
--
Alan Modra
Australia Development Lab, IBM

View File

@@ -0,0 +1,86 @@
commit be08eda54c7cf833ccfa4b8d1f1b1d668c26af66
Author: Andreas Jaeger <aj@suse.de>
Date: Wed May 23 09:27:39 2012 +0200
Update from Linux 3.4
[ Partial, unrelated bits not included. ]
2012-05-23 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/powerpc/bits/mman.h
(MADV_DONTDUMP,MADV_DODUMP): New macros from Linux 3.4.
macro.
* sysdeps/unix/sysv/linux/s390/bits/mman.h
(MADV_DONTDUMP,MADV_DODUMP): Likewise.
* sysdeps/unix/sysv/linux/i386/bits/mman.h
(MADV_DONTDUMP,MADV_DODUMP): Likewise.
* sysdeps/unix/sysv/linux/x86_64/bits/mman.h
(MADV_DONTDUMP,MADV_DODUMP): Likewise.
diff -Nrup a/sysdeps/unix/sysv/linux/i386/bits/mman.h b/sysdeps/unix/sysv/linux/i386/bits/mman.h
--- a/sysdeps/unix/sysv/linux/i386/bits/mman.h 2010-05-04 05:27:23.000000000 -0600
+++ b/sysdeps/unix/sysv/linux/i386/bits/mman.h 2012-09-27 11:44:26.985150148 -0600
@@ -1,5 +1,5 @@
/* Definitions for POSIX memory map interface. Linux/i386 version.
- Copyright (C) 1997,2000,2003,2005,2006,2009 Free Software Foundation, Inc.
+ Copyright (C) 1997-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -94,6 +94,9 @@
# define MADV_DOFORK 11 /* Do inherit across fork. */
# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
+# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
+ overrides the coredump filter bits. */
+# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
# define MADV_HWPOISON 100 /* Poison a page for testing. */
#endif
diff -Nrup a/sysdeps/unix/sysv/linux/powerpc/bits/mman.h b/sysdeps/unix/sysv/linux/powerpc/bits/mman.h
--- a/sysdeps/unix/sysv/linux/powerpc/bits/mman.h 2010-05-04 05:27:23.000000000 -0600
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/mman.h 2012-09-27 11:43:37.161351259 -0600
@@ -96,6 +96,9 @@
# define MADV_DOFORK 11 /* Do inherit across fork. */
# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
+# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
+ overrides the coredump filter bits. */
+# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
# define MADV_HWPOISON 100 /* Poison a page for testing. */
#endif
diff -Nrup a/sysdeps/unix/sysv/linux/s390/bits/mman.h b/sysdeps/unix/sysv/linux/s390/bits/mman.h
--- a/sysdeps/unix/sysv/linux/s390/bits/mman.h 2010-05-04 05:27:23.000000000 -0600
+++ b/sysdeps/unix/sysv/linux/s390/bits/mman.h 2012-09-27 11:44:49.745059646 -0600
@@ -94,6 +94,9 @@
# define MADV_DOFORK 11 /* Do inherit across fork. */
# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
+# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
+ overrides the coredump filter bits. */
+# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
# define MADV_HWPOISON 100 /* Poison a page for testing. */
#endif
diff -Nrup a/sysdeps/unix/sysv/linux/x86_64/bits/mman.h b/sysdeps/unix/sysv/linux/x86_64/bits/mman.h
--- a/sysdeps/unix/sysv/linux/x86_64/bits/mman.h 2010-05-04 05:27:23.000000000 -0600
+++ b/sysdeps/unix/sysv/linux/x86_64/bits/mman.h 2012-09-27 11:42:08.314725733 -0600
@@ -1,5 +1,5 @@
/* Definitions for POSIX memory map interface. Linux/x86_64 version.
- Copyright (C) 2001, 2003, 2005, 2006, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2001-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -95,6 +95,9 @@
# define MADV_DOFORK 11 /* Do inherit across fork. */
# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
+# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
+ overrides the coredump filter bits. */
+# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
# define MADV_HWPOISON 100 /* Poison a page for testing. */
#endif

View File

@@ -0,0 +1,81 @@
--- glibc-2.12-2-gc4ccff1/nscd/grpcache.c.lrgrpissue 2002-03-19 01:06:04.905969517 +0530
+++ glibc-2.12-2-gc4ccff1/nscd/grpcache.c 2002-03-19 01:09:46.495970850 +0530
@@ -207,10 +207,11 @@ cache_addgr (struct database_dyn *db, in
change. Allocate memory on the cache since it is likely
discarded anyway. If it turns out to be necessary to have a
new record we can still allocate real memory. */
- bool dataset_in_stack_or_freed = false;
+ bool dataset_temporary = false;
+ bool dataset_malloced = false;
dataset = NULL;
- if (he == NULL || ! __libc_use_alloca (alloca_used + total + n))
+ if (he == NULL)
dataset = (struct dataset *) mempool_alloc (db, total + n, 1);
if (dataset == NULL)
@@ -218,10 +219,16 @@ cache_addgr (struct database_dyn *db, in
/* We cannot permanently add the result in the moment. But
we can provide the result as is. Store the data in some
temporary memory. */
- dataset = (struct dataset *) alloca_account (total + n, alloca_used);
-
+ if (! __libc_use_alloca (alloca_used + total + n))
+ {
+ /* XXX What to do if malloc fails? */
+ dataset = (struct dataset *) malloc (total + n);
+ dataset_malloced = true;
+ }
+ else
+ dataset = (struct dataset *) alloca_account (total + n, alloca_used);
/* We cannot add this record to the permanent database. */
- dataset_in_stack_or_freed = true;
+ dataset_temporary = true;
}
dataset->head.allocsize = total + n;
@@ -276,13 +283,10 @@ cache_addgr (struct database_dyn *db, in
dh->timeout = dataset->head.timeout;
++dh->nreloads;
- /* If the new record was not allocated on the stack, then it must
- be freed. Note that it can no longer be used. */
- if (! dataset_in_stack_or_freed)
- {
- free (dataset);
- dataset_in_stack_or_freed = true;
- }
+ /* If the new record was allocated via malloc, then we
+ must free it here. */
+ if (dataset_malloced)
+ free (dataset);
}
else
{
@@ -298,7 +302,7 @@ cache_addgr (struct database_dyn *db, in
key_copy = (char *) newp + (key_copy - (char *) dataset);
dataset = memcpy (newp, dataset, total + n);
- dataset_in_stack_or_freed = false;
+ dataset_temporary = false;
}
/* Mark the old record as obsolete. */
@@ -313,7 +317,7 @@ cache_addgr (struct database_dyn *db, in
assert (fd != -1);
#ifdef HAVE_SENDFILE
- if (__builtin_expect (db->mmap_used, 1) && !dataset_in_stack_or_freed)
+ if (__builtin_expect (db->mmap_used, 1) && ! dataset_temporary)
{
assert (db->wr_fd != -1);
assert ((char *) &dataset->resp > (char *) db->data);
@@ -340,7 +344,7 @@ cache_addgr (struct database_dyn *db, in
/* Add the record to the database. But only if it has not been
stored on the stack. */
- if (! dataset_in_stack_or_freed)
+ if (! dataset_temporary)
{
/* If necessary, we also propagate the data to disk. */
if (db->persistent)

View File

@@ -0,0 +1,12 @@
diff -rup a/sysdeps/generic/netinet/ip.h b/sysdeps/generic/netinet/ip.h
--- a/sysdeps/generic/netinet/ip.h 2010-05-04 05:27:23.000000000 -0600
+++ b/sysdeps/generic/netinet/ip.h 2012-10-11 09:22:12.620160387 -0600
@@ -194,7 +194,7 @@ struct ip_timestamp
*/
#define IPTOS_CLASS_MASK 0xe0
-#define IPTOS_CLASS(class) ((tos) & IPTOS_CLASS_MASK)
+#define IPTOS_CLASS(class) ((class) & IPTOS_CLASS_MASK)
#define IPTOS_CLASS_CS0 0x00
#define IPTOS_CLASS_CS1 0x20
#define IPTOS_CLASS_CS2 0x40

View File

@@ -0,0 +1,21 @@
diff -pruN glibc-2.5-20061008T1257/sysdeps/x86_64/fpu/math_private.h glibc-2.5-20061008T1257.patched/sysdeps/x86_64/fpu/math_private.h
--- glibc-2.5-20061008T1257/sysdeps/x86_64/fpu/math_private.h 2013-02-12 07:05:08.000000000 -0500
+++ glibc-2.5-20061008T1257.patched/sysdeps/x86_64/fpu/math_private.h 2013-02-12 06:59:08.000000000 -0500
@@ -90,10 +90,14 @@ while (0)
#undef libc_feupdateenv
#define libc_feupdateenv(e) \
do { \
- unsigned int mxcsr; \
+ unsigned int mxcsr, new_mxcsr; \
asm volatile ("stmxcsr %0" : "=m" (*&mxcsr)); \
- asm volatile ("ldmxcsr %0" : : "m" ((e)->__mxcsr)); \
- feraiseexcept (mxcsr & FE_ALL_EXCEPT); \
+ /* Merge in the old exceptions. */ \
+ new_mxcsr = mxcsr & FE_ALL_EXCEPT | (e)->__mxcsr; \
+ asm volatile ("ldmxcsr %0" : : "m" (*&new_mxcsr)); \
+ /* Only raise exception if there are any that are not masked. */ \
+ if (~(mxcsr >> 7) & mxcsr & FE_ALL_EXCEPT) \
+ feraiseexcept (mxcsr & FE_ALL_EXCEPT); \
} while (0)
#undef libc_feupdateenvf
#define libc_feupdateenvf(e) libc_feupdateenv (e)

View File

@@ -0,0 +1,190 @@
#
# Patch provided by Ulrich Drepper in BZ#919562.
#
# Patch has not been sent upstream.
#
# 2013-03-08 Ulrich Drepper <drepper@gmail.com>
#
# * elf/rtld.c (dl_main): Correctly determine when the application
# required DSOs with TLS and bump the generation counter in that
# case. The current condition does not account for an audit
# module using TLS.
# * elf/dl-tls.c (_dl_count_modids): New function.
# (_dl_allocate_tls_init): Add assertion to check TLS
# generation.
# * sysdeps/generic/ldsodefs.h: Declare _dl_count_modids.
# * elf/Makefile: Add rules to build and run tst-audit9.
# * elf/tst-audit9.c: New file.
# * elf/tst-auditmod9a.c: New file.
# * elf/tst-auditmod9b.c: New file.
#
diff -urN glibc-2.12-2-gc4ccff1.orig/elf/dl-tls.c glibc-2.12-2-gc4ccff1/elf/dl-tls.c
--- glibc-2.12-2-gc4ccff1.orig/elf/dl-tls.c 2013-04-24 16:06:10.410756438 -0400
+++ glibc-2.12-2-gc4ccff1/elf/dl-tls.c 2013-04-24 16:06:49.092604707 -0400
@@ -109,6 +109,28 @@
}
+size_t
+internal_function
+_dl_count_modids (void)
+{
+ if (! __builtin_expect (GL(dl_tls_dtv_gaps), true))
+ return GL(dl_tls_max_dtv_idx);
+
+ size_t n = 0;
+ struct dtv_slotinfo_list *runp = GL(dl_tls_dtv_slotinfo_list);
+ while (runp != NULL)
+ {
+ for (size_t i = 0; i < runp->len; ++i)
+ if (runp->slotinfo[i].map != NULL)
+ ++n;
+
+ runp = runp->next;
+ }
+
+ return n;
+}
+
+
#ifdef SHARED
void
internal_function
@@ -411,6 +433,7 @@
/* Keep track of the maximum generation number. This might
not be the generation counter. */
+ assert (listp->slotinfo[cnt].gen <= GL(dl_tls_generation));
maxgen = MAX (maxgen, listp->slotinfo[cnt].gen);
if (map->l_tls_offset == NO_TLS_OFFSET
diff -urN glibc-2.12-2-gc4ccff1.orig/elf/Makefile glibc-2.12-2-gc4ccff1/elf/Makefile
--- glibc-2.12-2-gc4ccff1.orig/elf/Makefile 2013-04-24 16:06:10.408756448 -0400
+++ glibc-2.12-2-gc4ccff1/elf/Makefile 2013-04-24 16:07:29.475457962 -0400
@@ -97,6 +97,8 @@
tst-audit6.c tst-auditmod6a.c tst-auditmod6b.c \
tst-auditmod6c.c \
tst-audit7.c tst-auditmod7a.c tst-auditmod7b.c \
+ tst-audit9.c \
+ tst-auditmod9a.c tst-auditmod9b.c \
order2mod1.c order2mod2.c order2mod3.c order2mod4.c \
tst-stackguard1.c tst-stackguard1-static.c \
tst-array5.c tst-array5-static.c tst-array5dep.c \
@@ -198,7 +200,7 @@
tst-dlmodcount tst-dlopenrpath tst-deep1 \
tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \
unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
- tst-audit1 tst-audit2 \
+ tst-audit1 tst-audit2 tst-audit9 \
tst-stackguard1 tst-addr1 tst-thrlock \
tst-unique1 tst-unique2
# reldep9
@@ -251,7 +253,8 @@
unload8mod1 unload8mod1x unload8mod2 unload8mod3 \
order2mod1 order2mod2 order2mod3 order2mod4 \
tst-unique1mod1 tst-unique1mod2 \
- tst-unique2mod1 tst-unique2mod2
+ tst-unique2mod1 tst-unique2mod2 \
+ tst-auditmod9a tst-auditmod9b
ifeq (yes,$(have-initfini-array))
modules-names += tst-array2dep tst-array5dep
endif
@@ -574,6 +577,8 @@
ifuncmod1.so-no-z-defs = yes
ifuncmod5.so-no-z-defs = yes
ifuncmod6.so-no-z-defs = yes
+tst-auditmod9a.so-no-z-defs = yes
+tst-auditmod9b.so-no-z-defs = yes
ifeq ($(build-shared),yes)
# Build all the modules even when not actually running test programs.
@@ -1015,6 +1020,10 @@
$(objpfx)tst-audit7.out: $(objpfx)tst-auditmod7b.so
tst-audit7-ENV = LD_AUDIT=$(objpfx)tst-auditmod7b.so
+$(objpfx)tst-audit9: $(libdl)
+$(objpfx)tst-audit9.out: $(objpfx)tst-auditmod9a.so $(objpfx)tst-auditmod9b.so
+tst-audit9-ENV = LD_AUDIT=$(objpfx)tst-auditmod9a.so
+
$(objpfx)tst-global1: $(libdl)
$(objpfx)tst-global1.out: $(objpfx)testobj6.so $(objpfx)testobj2.so
diff -urN glibc-2.12-2-gc4ccff1.orig/elf/rtld.c glibc-2.12-2-gc4ccff1/elf/rtld.c
--- glibc-2.12-2-gc4ccff1.orig/elf/rtld.c 2013-04-24 16:06:10.410756438 -0400
+++ glibc-2.12-2-gc4ccff1/elf/rtld.c 2013-04-24 16:06:49.096604693 -0400
@@ -1637,6 +1637,10 @@
}
}
+ /* Keep track of the currently loaded modules to count how many
+ non-audit modules which use TLS are loaded. */
+ size_t count_modids = _dl_count_modids ();
+
/* Set up debugging before the debugger is notified for the first time. */
#ifdef ELF_MACHINE_DEBUG_SETUP
/* Some machines (e.g. MIPS) don't use DT_DEBUG in this way. */
@@ -2281,7 +2285,8 @@
# define NONTLS_INIT_TP do { } while (0)
#endif
- if (!was_tls_init_tp_called && GL(dl_tls_max_dtv_idx) > 0)
+ if ((!was_tls_init_tp_called && GL(dl_tls_max_dtv_idx) > 0)
+ || count_modids != _dl_count_modids ())
++GL(dl_tls_generation);
/* Now that we have completed relocation, the initializer data
diff -urN glibc-2.12-2-gc4ccff1.orig/elf/tst-audit9.c glibc-2.12-2-gc4ccff1/elf/tst-audit9.c
--- glibc-2.12-2-gc4ccff1.orig/elf/tst-audit9.c 1969-12-31 19:00:00.000000000 -0500
+++ glibc-2.12-2-gc4ccff1/elf/tst-audit9.c 2013-04-24 16:06:49.096604693 -0400
@@ -0,0 +1,8 @@
+#include <dlfcn.h>
+
+int main(void)
+{
+ void *h = dlopen("$ORIGIN/tst-auditmod9b.so", RTLD_LAZY);
+ int (*fp)(void) = dlsym(h, "f");
+ return fp() - 1;
+}
diff -urN glibc-2.12-2-gc4ccff1.orig/elf/tst-auditmod9a.c glibc-2.12-2-gc4ccff1/elf/tst-auditmod9a.c
--- glibc-2.12-2-gc4ccff1.orig/elf/tst-auditmod9a.c 1969-12-31 19:00:00.000000000 -0500
+++ glibc-2.12-2-gc4ccff1/elf/tst-auditmod9a.c 2013-04-24 16:06:49.097604689 -0400
@@ -0,0 +1,16 @@
+#include <stdint.h>
+
+__thread int var;
+
+unsigned int
+la_version (unsigned int v)
+{
+ return v;
+}
+
+void
+la_activity (uintptr_t *cookie, unsigned int flag)
+{
+ ++var;
+}
+
diff -urN glibc-2.12-2-gc4ccff1.orig/elf/tst-auditmod9b.c glibc-2.12-2-gc4ccff1/elf/tst-auditmod9b.c
--- glibc-2.12-2-gc4ccff1.orig/elf/tst-auditmod9b.c 1969-12-31 19:00:00.000000000 -0500
+++ glibc-2.12-2-gc4ccff1/elf/tst-auditmod9b.c 2013-04-24 16:06:49.097604689 -0400
@@ -0,0 +1,6 @@
+__thread int a;
+
+int f(void)
+{
+ return ++a;
+}
diff -urN glibc-2.12-2-gc4ccff1.orig/sysdeps/generic/ldsodefs.h glibc-2.12-2-gc4ccff1/sysdeps/generic/ldsodefs.h
--- glibc-2.12-2-gc4ccff1.orig/sysdeps/generic/ldsodefs.h 2013-04-24 16:06:10.545755798 -0400
+++ glibc-2.12-2-gc4ccff1/sysdeps/generic/ldsodefs.h 2013-04-24 16:06:49.098604686 -0400
@@ -1031,6 +1031,9 @@
/* Determine next available module ID. */
extern size_t _dl_next_tls_modid (void) internal_function attribute_hidden;
+/* Count the modules with TLS segments. */
+extern size_t _dl_count_modids (void) internal_function attribute_hidden;
+
/* Calculate offset of the TLS blocks in the static TLS block. */
extern void _dl_determine_tlsoffset (void) internal_function attribute_hidden;

View File

@@ -0,0 +1,107 @@
2013-05-03 Carlos O'Donell <carlos at redhat.com>
* intl/dcigettext.c (DCIGETTEXT): Skip translating if _nl_find_msg returns -1.
(_nl_find_msg): Return -1 if recursive call returned -1. If newmem is null
return -1.
* intl/loadmsgcat.c (_nl_load_domain): If _nl_find_msg returns -1 abort
loading the domain.
diff -Nrup a/intl/dcigettext.c b/intl/dcigettext.c
--- a/intl/dcigettext.c 2010-05-04 07:27:23.000000000 -0400
+++ b/intl/dcigettext.c 2013-08-01 00:11:54.616363264 -0400
@@ -640,6 +640,11 @@ DCIGETTEXT (domainname, msgid1, msgid2,
retval = _nl_find_msg (domain->successor[cnt], binding,
msgid1, 1, &retlen);
+ /* Resource problems are not fatal, instead we return no
+ translation. */
+ if (__builtin_expect (retval == (char *) -1, 0))
+ goto no_translation;
+
if (retval != NULL)
{
domain = domain->successor[cnt];
@@ -943,6 +948,11 @@ _nl_find_msg (domain_file, domainbinding
nullentry =
_nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
+ /* Resource problems are fatal. If we continue onwards we will
+ only attempt to calloc a new conv_tab and fail later. */
+ if (__builtin_expect (nullentry == (char *) -1, 0))
+ return (char *) -1;
+
if (nullentry != NULL)
{
const char *charsetstr;
@@ -1156,7 +1166,7 @@ _nl_find_msg (domain_file, domainbinding
freemem_size);
# ifdef _LIBC
if (newmem != NULL)
- transmem_list = transmem_list->next;
+ transmem_list = newmem;
else
{
struct transmem_list *old = transmem_list;
@@ -1171,6 +1181,16 @@ _nl_find_msg (domain_file, domainbinding
malloc_count = 1;
freemem_size = INITIAL_BLOCK_SIZE;
newmem = (transmem_block_t *) malloc (freemem_size);
+# ifdef _LIBC
+ if (newmem != NULL)
+ {
+ /* Add the block to the list of blocks we have to free
+ at some point. */
+ newmem->next = transmem_list;
+ transmem_list = newmem;
+ }
+ /* Fall through and return -1. */
+# endif
}
if (__builtin_expect (newmem == NULL, 0))
{
@@ -1181,11 +1201,6 @@ _nl_find_msg (domain_file, domainbinding
}
# ifdef _LIBC
- /* Add the block to the list of blocks we have to free
- at some point. */
- newmem->next = transmem_list;
- transmem_list = newmem;
-
freemem = (unsigned char *) newmem->data;
freemem_size -= offsetof (struct transmem_list, data);
# else
@@ -1402,7 +1417,7 @@ get_output_charset (domainbinding)
return _NL_CURRENT (LC_CTYPE, CODESET);
# else
# if HAVE_ICONV
- extern const char *locale_charset PARAMS ((void);
+ extern const char *locale_charset PARAMS ((void));
return locale_charset ();
# endif
# endif
diff -Nrup a/intl/loadmsgcat.c b/intl/loadmsgcat.c
--- a/intl/loadmsgcat.c 2010-05-04 07:27:23.000000000 -0400
+++ b/intl/loadmsgcat.c 2013-08-01 00:12:48.448237849 -0400
@@ -1235,7 +1235,7 @@ _nl_load_domain (domain_file, domainbind
default:
/* This is an invalid revision. */
invalid:
- /* This is an invalid .mo file. */
+ /* This is an invalid .mo file or we ran out of resources. */
free (domain->malloced);
#ifdef HAVE_MMAP
if (use_mmap)
@@ -1255,6 +1255,12 @@ _nl_load_domain (domain_file, domainbind
/* Get the header entry and look for a plural specification. */
nullentry = _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
+ if (__builtin_expect (nullentry == (char *) -1, 0))
+ {
+ __libc_rwlock_fini (domain->conversions_lock);
+ goto invalid;
+ }
+
EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
out:

View File

@@ -0,0 +1,181 @@
#
# Red Hat BZ:
# https://bugzilla.redhat.com/show_bug.cgi?id=816647
#
# ChangeLog
#
#2013-04-30 Patsy Franklin <pfrankli@redhat.com>
#
# * iconv/gconv_cache.c (find_module): Demangle init_fct before
# checking for NULL. Mangle __btowc_fct if init_fct is non-NULL.
# * iconv/gconv_db.c (free_derivation): Check that __shlib_handle
# is non-NULL before demangling the end_fct. Check for NULL
# end_fct after demangling.
# (__gconv_release_step): Demangle the end_fct before checking
# it for NULL. Remove assert on __shlibc_handle != NULL.
# (gen_steps): Don't check btowc_fct for NULL before mangling.
# Demangle init_fct before checking for NULL.
# (increment_counter): Likewise
# * gconv_dl.c (__gconv_find_shlib): Don't check init_fct or
# end_fct for NULL before mangling.
# * wcsmbs/btowc.c (__btowc): Demangle btowc_fct before checking
# for NULL.
#
diff -Nrup a/iconv/gconv_cache.c b/iconv/gconv_cache.c
--- a/iconv/gconv_cache.c 2012-12-24 22:02:13.000000000 -0500
+++ b/iconv/gconv_cache.c 2013-04-30 11:34:20.112389987 -0400
@@ -207,17 +207,16 @@ find_module (const char *directory, cons
result->__data = NULL;
/* Call the init function. */
- if (result->__init_fct != NULL)
- {
- __gconv_init_fct init_fct = result->__init_fct;
+ __gconv_init_fct init_fct = result->__init_fct;
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (init_fct);
+ PTR_DEMANGLE (init_fct);
#endif
+ if (init_fct != NULL)
+ {
status = DL_CALL_FCT (init_fct, (result));
#ifdef PTR_MANGLE
- if (result->__btowc_fct != NULL)
- PTR_MANGLE (result->__btowc_fct);
+ PTR_MANGLE (result->__btowc_fct);
#endif
}
}
diff -Nrup a/iconv/gconv_db.c b/iconv/gconv_db.c
--- a/iconv/gconv_db.c 2012-12-24 22:02:13.000000000 -0500
+++ b/iconv/gconv_db.c 2013-04-30 11:32:42.700592914 -0400
@@ -179,16 +179,15 @@ free_derivation (void *p)
size_t cnt;
for (cnt = 0; cnt < deriv->nsteps; ++cnt)
- if (deriv->steps[cnt].__counter > 0
- && deriv->steps[cnt].__end_fct != NULL)
+ if ((deriv->steps[cnt].__counter > 0)
+ && (deriv->steps[cnt].__shlib_handle != NULL))
{
- assert (deriv->steps[cnt].__shlib_handle != NULL);
-
__gconv_end_fct end_fct = deriv->steps[cnt].__end_fct;
#ifdef PTR_DEMANGLE
PTR_DEMANGLE (end_fct);
#endif
- DL_CALL_FCT (end_fct, (&deriv->steps[cnt]));
+ if (end_fct != NULL)
+ DL_CALL_FCT (end_fct, (&deriv->steps[cnt]));
}
/* Free the name strings. */
@@ -212,16 +211,12 @@ __gconv_release_step (struct __gconv_ste
if (step->__shlib_handle != NULL && --step->__counter == 0)
{
/* Call the destructor. */
- if (step->__end_fct != NULL)
- {
- assert (step->__shlib_handle != NULL);
-
- __gconv_end_fct end_fct = step->__end_fct;
+ __gconv_end_fct end_fct = step->__end_fct;
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (end_fct);
+ PTR_DEMANGLE (end_fct);
#endif
- DL_CALL_FCT (end_fct, (step));
- }
+ if (end_fct != NULL)
+ DL_CALL_FCT (end_fct, (step));
#ifndef STATIC_GCONV
/* Release the loaded module. */
@@ -293,13 +288,11 @@ gen_steps (struct derivation_step *best,
/* Call the init function. */
__gconv_init_fct init_fct = result[step_cnt].__init_fct;
- if (init_fct != NULL)
- {
- assert (result[step_cnt].__shlib_handle != NULL);
-
# ifdef PTR_DEMANGLE
- PTR_DEMANGLE (init_fct);
+ PTR_DEMANGLE (init_fct);
# endif
+ if (init_fct != NULL)
+ {
status = DL_CALL_FCT (init_fct, (&result[step_cnt]));
if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK)
@@ -312,8 +305,7 @@ gen_steps (struct derivation_step *best,
}
# ifdef PTR_MANGLE
- if (result[step_cnt].__btowc_fct != NULL)
- PTR_MANGLE (result[step_cnt].__btowc_fct);
+ PTR_MANGLE (result[step_cnt].__btowc_fct);
# endif
}
}
@@ -393,16 +385,15 @@ increment_counter (struct __gconv_step *
/* Call the init function. */
__gconv_init_fct init_fct = step->__init_fct;
- if (init_fct != NULL)
- {
#ifdef PTR_DEMANGLE
- PTR_DEMANGLE (init_fct);
+ PTR_DEMANGLE (init_fct);
#endif
+ if (init_fct != NULL)
+ {
DL_CALL_FCT (init_fct, (step));
#ifdef PTR_MANGLE
- if (step->__btowc_fct != NULL)
- PTR_MANGLE (step->__btowc_fct);
+ PTR_MANGLE (step->__btowc_fct);
#endif
}
}
diff -Nrup a/iconv/gconv_dl.c b/iconv/gconv_dl.c
--- a/iconv/gconv_dl.c 2012-12-24 22:02:13.000000000 -0500
+++ b/iconv/gconv_dl.c 2013-04-30 11:32:42.701592922 -0400
@@ -132,10 +132,8 @@ __gconv_find_shlib (const char *name)
#ifdef PTR_MANGLE
PTR_MANGLE (found->fct);
- if (found->init_fct != NULL)
- PTR_MANGLE (found->init_fct);
- if (found->end_fct != NULL)
- PTR_MANGLE (found->end_fct);
+ PTR_MANGLE (found->init_fct);
+ PTR_MANGLE (found->end_fct);
#endif
/* We have succeeded in loading the shared object. */
diff -Nrup a/wcsmbs/btowc.c b/wcsmbs/btowc.c
--- a/wcsmbs/btowc.c 2012-12-24 22:02:13.000000000 -0500
+++ b/wcsmbs/btowc.c 2013-04-30 11:32:42.701592922 -0400
@@ -47,15 +47,15 @@ __btowc (c)
/* Get the conversion functions. */
fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE));
__gconv_btowc_fct btowc_fct = fcts->towc->__btowc_fct;
+#ifdef PTR_DEMANGLE
+ if (fcts->towc->__shlib_handle != NULL)
+ PTR_DEMANGLE (btowc_fct);
+#endif
if (__builtin_expect (fcts->towc_nsteps == 1, 1)
&& __builtin_expect (btowc_fct != NULL, 1))
{
/* Use the shortcut function. */
-#ifdef PTR_DEMANGLE
- if (fcts->towc->__shlib_handle != NULL)
- PTR_DEMANGLE (btowc_fct);
-#endif
return DL_CALL_FCT (btowc_fct, (fcts->towc, (unsigned char) c));
}
else

View File

@@ -637,7 +637,42 @@ if ($ip ne $ipcache) {
} else {
&General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");
}
} else {
}
elsif ($settings{'SERVICE'} eq 'udmedia.de') {
# use proxy ?
my %proxysettings;
&General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
}
if ($settings{'HOSTNAME'} eq '') {
$settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
} else {
$settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
}
my ($out, $response) = Net::SSLeay::get_https( 'www.udmedia.de',
443,
"/nic/update?myip=$ip&username=$settings{'HOSTDOMAIN'}&password=$settings{'PASSWORD'}",
Net::SSLeay::make_headers('User-Agent' => 'IPFire',
'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")) );
# Valid response are 'ok' 'nochange'
if ($response =~ m%HTTP/1\.. 200 OK%) {
if ( $out !~ m/^(ok|nochg)/ ) {
$out =~ s/\n/ /g;
&General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");
} else {
&General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");
$success++;
}
} else {
&General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials---$out-$response--)");
}
}
else {
if ($settings{'WILDCARDS'} eq 'on') {
$settings{'WILDCARDS'} = '-w';
} else {