| 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

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 */