Bug #20145 perror segfault when call it with error nr
| Submitted: | 30 May 2006 11:09 | Modified: | 15 Aug 2006 3:07 |
|---|---|---|---|
| Reporter: | Markus Heinze | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Command-line Clients | Severity: | S3 (Non-critical) |
| Version: | 5.0.21 | OS: | Solaris (Solaris 8) |
| Assigned to: | Magnus Blåudd | CPU Architecture: | Any |
[13 Jun 2006 16:11]
Valeriy Kravchuk
Thank you for a problem report. Can you try to repeat with MySQL's binaries? The problem is that we do not really use gcc for builds on platforms with "native" C compilers, so gcc environment on any our Solaris boxes is not "clear enough" to repeat this (although, I'll try to build with gcc if official binaries will not demonstrate the behaviour described). I was also unable to repeat this on Linux with gcc 3.3.5, so it can be a compiler-related problem as well.
[14 Jun 2006 9:04]
Markus Heinze
I have tried the binary version (mysql-standard-5.0.22-solaris8-sparc-64bit.pkg.gz) for Solaris 8 and get the same problem.
./perror 150
Segmentation Fault (core dumped)
./perror -v
./perror Ver 2.10, for sun-solaris2.8 (sparc)
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Print a description for a system error code or an error code from
a MyISAM/ISAM/BDB table handler.
If you want to get the error for a negative error code, you should use
-- before the first error code to tell perror that there was no more options.
Usage: ./perror [OPTIONS] [ERRORCODE [ERRORCODE...]]
-?, --help Displays this help and exits.
-I, --info Synonym for --help.
-s, --silent Only print the error message.
-v, --verbose Print error code and message (default).
-V, --version Displays version information and exits.
Variables (--variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
--------------------------------- -----------------------------
verbose TRUE
[29 Jun 2006 10:26]
Sveta Smirnova
Verified as reporter described:
mysqldev@sunfire100a:~/sveta/mysql-standard-5.0.22-solaris8-sparc-64bit> uname -a
SunOS sunfire100a 5.8 Generic_117350-25 sun4u sparc SUNW,UltraAX-i2
mysqldev@sunfire100a:~/sveta/mysql-standard-5.0.22-solaris8-sparc-64bit> bin/perror 150
Segmentation Fault (core dumped)
mysqldev@sunfire100a:~/sveta/mysql-standard-5.0.22-solaris8-sparc-64bit> bin/perror -v
bin/perror Ver 2.10, for sun-solaris2.8 (sparc)
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Print a description for a system error code or an error code from
a MyISAM/ISAM/BDB table handler.
If you want to get the error for a negative error code, you should use
-- before the first error code to tell perror that there was no more options.
Usage: bin/perror [OPTIONS] [ERRORCODE [ERRORCODE...]]
-?, --help Displays this help and exits.
-I, --info Synonym for --help.
-s, --silent Only print the error message.
-v, --verbose Print error code and message (default).
-V, --version Displays version information and exits.
Variables (--variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
--------------------------------- -----------------------------
verbose TRUE
[29 Jun 2006 10:36]
Sveta Smirnova
I can not repeat this error on Solaris9 SPARC and Solaris10 x86.
[29 Jun 2006 10:43]
Sveta Smirnova
We have duplicate bug #20731
[4 Jul 2006 13:18]
Steven Xie
I didn't find this one last time. Please ignore the new bug report. It's the same bug.
[4 Jul 2006 13:24]
Steven Xie
For solaris 8/7/6
strerror
RETURN VALUES
The strerror() function returns NULL if errnum is out-of-
range.
For solaris 9/10
RETURN VALUES
Upon successful completion, strerror() returns a pointer to
the generated message string. Otherwise, it sets errno and
returns a pointer to an error message string. It returns the
string "Unknown error" if errnum is not a valid error
number.
That's why you couldn't reproduce it on solaris 9/10.
It's a bug.
BTW,
It's not safe to have code like below
/*
On some system, like NETWARE, strerror(unknown_error) returns a
string 'Unknown Error'. To avoid printing it we try to find the
error string by asking for an impossible big error message.
*/
msg= strerror(10000);
/* msg could be set to NULL under some platforms
* then strlen would core .
*/
/*
Allocate a buffer for unknown_error since strerror always
returns
the same pointer on some platforms such as Windows
*/
unknown_error= malloc(strlen(msg)+1);
Suggested fix:
/*
On some system, like NETWARE, strerror(unknown_error) returns a
string 'Unknown Error'. To avoid printing it we try to find the
error string by asking for an impossible big error message.
*/
msg= strerror(10000);
/* msg could be set to NULL on some platforms
* e.g solaris 2.8
*/
if (NULL==msg)
msg="Unknown Error";
/*
Allocate a buffer for unknown_error since strerror always
returns
the same pointer on some platforms such as Windows
*/
unknown_error= malloc(strlen(msg)+1);
[24 Jul 2006 16:10]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/9505
[3 Aug 2006 16:47]
Magnus Blåudd
Pushed to 5.0.25
[3 Aug 2006 17:22]
Paul DuBois
Noted in 5.0.25 changelog. perror crashed on Solaris due to NULL return value of strerror() system call.
[14 Aug 2006 20:51]
Konstantin Osipov
Merged into 5.1.12
[15 Aug 2006 3:07]
Paul DuBois
Noted in 5.1.12 changelog.
[11 Jan 2007 13:46]
Sveta Smirnova
There is similar bug #25344
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.068 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: When built from source the tool extra/perror it segfaults if i run ./perror <errornr>. gcc -version: gcc (GCC) 3.3.2 Copyright (C) 2003 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. builded with: #!/bin/bash . platform.sh export CXX=gcc #export CFLAGS="-O3 -DUSE_OLD_FUNCTIONS" export CFLAGS="-DUSE_OLD_FUNCTIONS" export CXXFLAGS=$CFLAGS #export CXXFLAGS="$CFLAGS -felide-constructors -fno-exceptions -fno-rtti" #echo $CXXFLAGS cd mysql ./configure \ --prefix=/usr/local \ --sysconfdir=/etc \ --localstatedir=/JobsAdverts/SqlServer/var \ --enable-thread-safe-client \ --enable-assembler \ --enable-static \ --with-raid \ --with-mysql-user=mysql \ --without-debug \ --without-docs \ --without-bench \ --with-extra-charsets=complex \ --with-innodb \ $MAKE -j 4 && cd mysql-test && ./mysql-test-run --force cd .. How to repeat: run perror with errnr e.g. ./perror 150 Suggested fix: I have outcommented the NETWARE initialization and it works for me now. I should be better written between #ifdef / #endif tags. --- perror.c.orig Wed Apr 26 20:31:09 2006 +++ perror.c Wed May 3 13:58:29 2006 @@ -218,10 +218,10 @@ On some system, like NETWARE, strerror(unknown_error) returns a string 'Unknown Error'. To avoid printing it we try to find the error string by asking for an impossible big error message. - */ + msg= strerror(10000); - /* + Allocate a buffer for unknown_error since strerror always returns the same pointer on some platforms such as Windows */