Skip to contentSkip to conversation

sendto generates SIGSEGV

DISCUSSION Oliver Kowalke 2 participants 2 messages Jul 29, 2001

lore
Share & tools
lore
#0 lore raw

Hi,

I've written an c++ class which wrappes a socket.. With function writen() you can write to an TCP and UDP socket ( TCP : pointer to stuct sockaddr == NULL; UDP : pointer to struct sockaddr != NULL). If I use this function with TCP sockets all works. If I call this function for an UDP socket it generates an SIGSEGV signal.
What is wrong?

with regards,
Oliver

ssize_t writen( const void * vptr, size_t n, struct sockaddr * to)

{
        size_t          nleft = n;
        ssize_t         nwritten;
        const char      *ptr = static_cast< const char * >( vptr);
        
        struct sigaction new_sa;
        struct sigaction old_sa;
        
        new_sa.sa_handler = SIG_IGN;
        ::sigemptyset( & new_sa.sa_mask);
        new_sa.sa_flags = 0;
        ::sigaction( SIGPIPE, & new_sa, & old_sa);              

        while ( nleft > 0)
        {

                if ( ( nwritten = ::sendto( m_handle, ptr, nleft, 0, to, 

sizeof * to)

)<=0)

                {
                        if ( errno == EINTR)
                                nwritten = 0;   // and call sendto() again
                        else if ( errno == EPIPE)
                        {
                                ::sigaction( SIGPIPE, & old_sa, 0);

                                return -1;              // write to sock with 

no readers (peer has the sock closed)

                        }
                        else
                        {
                                ::sigaction( SIGPIPE, & old_sa, 0);
                                throw; // error
                        }
                }

                nleft -= nwritten;
                ptr   += nwritten;
        }
        ::sigaction( SIGPIPE, & old_sa, 0);     // set to its previous action

        return n;
}

here the output of the generated core file:

Core was generated by 'lt-ogx 192.168.1.3 10000'. Program terminated with signal 11, Segmentation fault. rw_common (): write: Success.
warning: unable to get global thread event mask [New Thread 1024 (LWP 32350)]
rw_common (): write: Success.
warning: stop_or_attach_thread: generic error #0 0x0 in ?? ()

#1 lore raw
Quoted 4 lines · Oliver Kowalke

From: [email protected] (Oliver Kowalke)
To: [email protected]
Subject: sendto generates SIGSEGV
Date: Sun, 29 Jul 2001 23:27:29 +0200

Two hours ago you asked this very same question at the linux-net -list. At how many lists you are asking this ?

Quoted 8 lines

Hi,

I've written an c++ class which wrappes a socket.. With function writen() you can write to an TCP and UDP socket ( TCP : pointer to stuct sockaddr == NULL; UDP : pointer to struct sockaddr != NULL). If I use this function with TCP sockets all works. If I call this function for an UDP socket it generates an SIGSEGV signal.
What is wrong?

You are presenting incomplete source, and worse, incomplete
debug trace. Furthermore, this really does not look like KERNEL
problem, which makes it Out-of-Topic issue at these lists.

From certain signature features in the very scant debug data, I would venture to think that you are running it at Solaris, and debugging it there.

Do yourself a favour and learn to use debuggers, and compile for
debugging. ``Backtrace'' or ``where'' (or whatever the debugger
of your choice calls it) is your friend in most cases.

Syscall trace may give you also some clues in some cases. At Solaris see: 'man truss'. At Linux see: 'man strace'.

If you can show strace output with SIGSEGV during a network syscall,
now THAT would be most appropriate at the linux-net list.

Quoted 2 lines

with regards,
Oliver

/Matti Aarnio

Quoted 53 lines

ssize_t writen( const void * vptr, size_t n, struct sockaddr * to)

{
        size_t          nleft = n;
        ssize_t         nwritten;
        const char      *ptr = static_cast< const char * >( vptr);
        
        struct sigaction new_sa;
        struct sigaction old_sa;
        
        new_sa.sa_handler = SIG_IGN;
        ::sigemptyset( & new_sa.sa_mask);
        new_sa.sa_flags = 0;
        ::sigaction( SIGPIPE, & new_sa, & old_sa);              

        while ( nleft > 0)
        {

                if ( ( nwritten = ::sendto( m_handle, ptr, nleft, 0, to, sizeof * to) )<=0)
                {
                        if ( errno == EINTR)
                                nwritten = 0;   // and call sendto() again
                        else if ( errno == EPIPE)
                        {
                                ::sigaction( SIGPIPE, & old_sa, 0);

                                return -1;              // write to sock with no readers (peer has the sock closed)

                        }
                        else
                        {
                                ::sigaction( SIGPIPE, & old_sa, 0);
                                throw; // error
                        }
                }

                nleft -= nwritten;
                ptr   += nwritten;
        }
        ::sigaction( SIGPIPE, & old_sa, 0);     // set to its previous action

        return n;
}

here the output of the generated core file:

Core was generated by 'lt-ogx 192.168.1.3 10000'. Program terminated with signal 11, Segmentation fault. rw_common (): write: Success.
warning: unable to get global thread event mask [New Thread 1024 (LWP 32350)]
rw_common (): write: Success.
warning: stop_or_attach_thread: generic error #0 0x0 in ?? ()