I guess you should apply CVS account instead of asking to commit your
patch :)

If you don't want CVS account, send me a email. After I test your patch
a bit, I'll commit it.

--
Yasuo Ohgaki

Ilia A. wrote:

> Attached to this message is a patch to php's shmop extension, it fixes the 
> following:
> 
> - shmop_open has a new flag for read/write access, 'w' (bug #10530, 10656)
> - shmop_open has a new flag for create only 'n' (bug #10530, 10656)
> - eliminated a segfault when trying to write to a SHM_RDONLY segment (bug 
> #14784)
> - eliminated a segfault when an invalid flag which starts with 'a' or 'c' is 
> passed (bug #14784)
> - updated creators' email addresses
> - changed error messages to say shmop_* instead of shm* to correspond with 
> new shmop_* function names
> 
> Could someone with a CVS access please implement the diff and close the 3 bug 
> reports I've outlined. I will submit a patch to the shmop's php documentation 
> shortly.
> 
> I've tested this diff on PHP 4.0.6,4.1.0 & 4.1.1 it seems to work fine on all 
> of them. On 4.0.6 patch complains a little but it works fine non the less.
> 
> cd php4;
> patch -p0 < shmop.diff
> 
> 
> ------------------------------------------------------------------------
> 
> diff -urN ext/shmop/ChangeLog ext/shmop/ChangeLog
> --- ext/shmop/ChangeLog       Wed Dec 31 19:00:00 1969
> +++ ext/shmop/ChangeLog       Wed Jan  2 13:15:34 2002
> @@ -0,0 +1,7 @@
> +Jan, 2, 2002
> +
> +- shmop_open has a new flag for read/write access, 'w' (bug #10530, 10656)
> +- shmop_open has a new flag for create only 'n' (bug #10530, 10656)
> +- eliminated a segfault when trying to write to a SHM_RDONLY segment (bug #14784)
> +- eliminated a segfault when an invalid flag which starts with 'a' or 'c' is passed 
>(bug #14784)
> +- updated creators' email addresses
> +- changed error messages to say shmop_* instead of shm* to correspond with new 
>shmop_* function names
> diff -urN ext/shmop/README ext/shmop/README
> --- ext/shmop/README  Tue Oct  3 17:56:21 2000
> +++ ext/shmop/README  Wed Jan  2 13:57:23 2002
> @@ -1,31 +1,35 @@
> -last update sept 3, 2000 ([EMAIL PROTECTED][EMAIL PROTECTED])
> +last update Jan 2, 2002 ([EMAIL PROTECTED][EMAIL PROTECTED])
>  
>  Shared Memory Operations Extension to PHP4
>  
> -     While developing a search deamon we needed the php based front end
> -     to communicate the deamon via SHM. Now, PHP already had a shared memory
> +     While developing a search deamon we needed a php based front end
> +     to communicate the deamon via SHM. PHP already had a shared memory
>       extention (sysvshm) written by Christian Cartus <[EMAIL PROTECTED]>,
> -     unfortunatly this extention was designed with PHP only in mind, and
> +     unfortunatly this extention was designed with PHP only in mind and
>       offers high level features which are extremly bothersome for basic SHM
> -     we had in mind.  After spending a day trying to reverse engeener figure
> +     we had in mind.  After spending a day trying to reverse engineer and figure
>       out the format of sysvshm we decided that it would be much easier to
>       add our own extention to php for simple SHM operations, we were right :)). 
>  
>  the functions are:
>       
> -int shm_open(int key, string flags, int mode, int size)
> +int shmop_open(int key, string flags, int mode, int size)
>       
>       key             - the key of/for the shared memory block
> -     flags           - 2 flags are avalible 
> -                             a for access  (sets IPC_EXCL)
> -                             c for create  (sets IPC_CREATE)
> +     flags           - 3 flags are avalible 
> +                             a for read only access (sets SHM_RDONLY)
> +                             w for read & write access
> +                             c create or open an existing segment (sets IPC_CREATE)
> +                             n create a new segment and fail if one already exists 
>under same name (sets IPC_CREATE|IPC_EXCL)
> +                             (the n flag is mostly useful for security perpouses, 
>so that you don't end up opening a faked segment 
> +                             if someone guesses your key)
>       mode            - acsess mode same as for a file (0644) for example
>       size            - size of the block in bytes
>       
>       returns an indentifier
>       
>  
> -char shm_read(int shmid, int start, int count)
> +char shmop_read(int shmid, int start, int count)
>  
>       shmid           - shmid from which to read
>       start           - offset from which to start reading
> @@ -33,7 +37,7 @@
>       
>       returns the data read
>  
> -int shm_write(int shmid, string data, int offset)
> +int shmop_write(int shmid, string data, int offset)
>  
>       shmid           - shmid from which to read
>       data            - string to put into shared memory
> @@ -41,14 +45,14 @@
>       
>       returns bytes written
>       
> -int shm_size(int shmid)
> +int shmop_size(int shmid)
>  
>       shmid           - shmid for which to return the size
>       
>       returns the size in bytes of the shm segment
>       
>       
> -int shm_delete(int shmid)
> +int shmop_delete(int shmid)
>  
>       marks the segment for deletion, the segment will be deleted when all processes 
>mapping it will detach
>  
> @@ -56,7 +60,7 @@
>       
>       returns 1 if all ok, zero on failure
>       
> -int shm_close(int shmid)
> +int shmop_close(int shmid)
>  
>       shmid           - shmid which to close
>       
> diff -urN ext/shmop/php_shmop.h ext/shmop/php_shmop.h
> --- ext/shmop/php_shmop.h     Mon Sep 17 09:43:11 2001
> +++ ext/shmop/php_shmop.h     Wed Jan  2 13:06:18 2002
> @@ -12,8 +12,8 @@
>     | obtain it through the world-wide-web, please send a note to          |
>     | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
>     +----------------------------------------------------------------------+
> -   | Authors: Slava Poliakov ([EMAIL PROTECTED])                    |
> -   |          Ilia Alshanetsky ([EMAIL PROTECTED])                           |
> +   | Authors: Slava Poliakov ([EMAIL PROTECTED])                    |
> +   |          Ilia Alshanetsky ([EMAIL PROTECTED])                      |
>     +----------------------------------------------------------------------+
>   */
>  #ifndef PHP_SHMOP_H
> @@ -52,6 +52,7 @@
>       int shmid;
>       key_t key;
>       int shmflg;
> +     int shmatflg;
>       char *addr;
>       int size;
>  };
> diff -urN ext/shmop/shmop.c ext/shmop/shmop.c
> --- ext/shmop/shmop.c Thu Oct 11 19:52:01 2001
> +++ ext/shmop/shmop.c Wed Jan  2 13:53:52 2002
> @@ -12,8 +12,8 @@
>     | obtain it through the world-wide-web, please send a note to          |
>     | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
>     +----------------------------------------------------------------------+
> -   | Authors: Slava Poliakov ([EMAIL PROTECTED])                    |
> -   |          Ilia Alshanetsky ([EMAIL PROTECTED])                           |
> +   | Authors: Slava Poliakov ([EMAIL PROTECTED])                              |
> +   |          Ilia Alshanetsky ([EMAIL PROTECTED])                         |
>     +----------------------------------------------------------------------+
>   */
>  /* $Id: shmop.c,v 1.16.2.1 2001/10/11 23:52:01 ssb Exp $ */
> @@ -125,7 +125,6 @@
>       struct php_shmop *shmop;        
>       struct shmid_ds shm;
>       int rsid;
> -     int shmflg=0;
>  
>       if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &key, &flags, &mode, 
>&size) == FAILURE) {
>               WRONG_PARAM_COUNT;
> @@ -142,37 +141,53 @@
>       shmop->key = (*key)->value.lval;
>       shmop->shmflg |= (*mode)->value.lval;
>  
> -     if (memchr((*flags)->value.str.val, 'a', (*flags)->value.str.len)) {
> -             shmflg = SHM_RDONLY;
> -             shmop->shmflg |= IPC_EXCL;
> -     } 
> -     else if (memchr((*flags)->value.str.val, 'c', (*flags)->value.str.len)) {
> -             shmop->shmflg |= IPC_CREAT;
> -             shmop->size = (*size)->value.lval;
> -     }
> -     else {
> -             php_error(E_WARNING, "shmopen: access mode invalid");
> -             efree(shmop);
> +     if( (*flags)->value.str.len != 1 ) {
> +             php_error(E_WARNING, "shmop_open: invalid flag");
>               RETURN_FALSE;
>       }
>  
> +     switch( (*flags)->value.str.val[0] ) 
> +     {
> +             case 'a':
> +                     shmop->shmatflg |= SHM_RDONLY;
> +                     break;
> +             case 'c':
> +                     shmop->shmflg |= IPC_CREAT;
> +                     shmop->size = (*size)->value.lval;
> +                     break;
> +             case 'n':
> +                     shmop->shmflg |= (IPC_CREAT|IPC_EXCL);
> +                     shmop->size = (*size)->value.lval;
> +                     break;  
> +             case 'w':
> +                     /* noop 
> +                             shm segment is being opened for read & write
> +                             will fail if segment does not exist
> +                     */
> +                     break;
> +             default:
> +                     php_error(E_WARNING, "shmop_open: invalid access mode");
> +                     efree(shmop);
> +                     RETURN_FALSE;
> +     }
> +
>       shmop->shmid = shmget(shmop->key, shmop->size, shmop->shmflg);
>       if (shmop->shmid == -1) {
> -             php_error(E_WARNING, "shmopen: can't get the block");
> +             php_error(E_WARNING, "shmop_open: unable to attach or create shm 
>segment");
>               efree(shmop);
>               RETURN_FALSE;
>       }
>  
>       if (shmctl(shmop->shmid, IPC_STAT, &shm)) {
>               efree(shmop);
> -             php_error(E_WARNING, "shmopen: can't get information on the block");
> +             php_error(E_WARNING, "shmop_open: unable to get shm segment 
>information");
>               RETURN_FALSE;
>       }       
>  
> -     shmop->addr = shmat(shmop->shmid, 0, shmflg);
> +     shmop->addr = shmat(shmop->shmid, 0, shmop->shmatflg);
>       if (shmop->addr == (char*) -1) {
>               efree(shmop);
> -             php_error(E_WARNING, "shmopen: can't attach the memory block");
> +             php_error(E_WARNING, "shmop_open: unable to attach to shm segment");
>               RETURN_FALSE;
>       }
>  
> @@ -205,22 +220,22 @@
>       shmop = zend_list_find((*shmid)->value.lval, &type);    
>  
>       if (!shmop) {
> -             php_error(E_WARNING, "shmread: can't find this segment");
> +             php_error(E_WARNING, "shmop_read: can't find this segment");
>               RETURN_FALSE;
>       }
>  
>       if ((*start)->value.lval < 0 || (*start)->value.lval > shmop->size) {
> -             php_error(E_WARNING, "shmread: start is out of range");
> +             php_error(E_WARNING, "shmop_read: start is out of range");
>               RETURN_FALSE;
>       }
>  
>       if (((*start)->value.lval+(*count)->value.lval) > shmop->size) {
> -             php_error(E_WARNING, "shmread: count is out of range");
> +             php_error(E_WARNING, "shmop_read: count is out of range");
>               RETURN_FALSE;
>       }
>  
>       if ((*count)->value.lval < 0 ){
> -             php_error(E_WARNING, "shmread: count is out of range");
> +             php_error(E_WARNING, "shmop_read: count is out of range");
>               RETURN_FALSE;
>       }
>  
> @@ -249,7 +264,7 @@
>       shmop = zend_list_find((*shmid)->value.lval, &type);
>  
>       if (!shmop) {
> -             php_error(E_WARNING, "shmclose: no such shmid");
> +             php_error(E_WARNING, "shmop_close: no such shmid");
>               RETURN_FALSE;
>       }
>       zend_list_delete((*shmid)->value.lval);
> @@ -273,7 +288,7 @@
>       shmop = zend_list_find((*shmid)->value.lval, &type);
>  
>       if (!shmop) {
> -             php_error(E_WARNING, "shmsize: no such segment");
> +             php_error(E_WARNING, "shmop_size: no such segment");
>               RETURN_FALSE;
>       }
>  
> @@ -301,12 +316,17 @@
>       shmop = zend_list_find((*shmid)->value.lval, &type);
>  
>       if (!shmop) {
> -             php_error(E_WARNING, "shmwrite: error no such segment");
> +             php_error(E_WARNING, "shmop_write: error no such segment");
> +             RETURN_FALSE;
> +     }
> +
> +     if( (shmop->shmatflg&SHM_RDONLY) == SHM_RDONLY ) {
> +             php_error(E_WARNING, "shmop_write: trying to write to a read only 
>segment");
>               RETURN_FALSE;
>       }
>  
>       if ( (*offset)->value.lval > shmop->size ) {
> -             php_error(E_WARNING, "shmwrite: offset out of range");
> +             php_error(E_WARNING, "shmop_write: offset out of range");
>               RETURN_FALSE;
>       }
>  
> @@ -334,12 +354,12 @@
>       shmop = zend_list_find((*shmid)->value.lval, &type);
>  
>       if (!shmop) {
> -             php_error(E_WARNING, "shmdelete: error no such segment");
> +             php_error(E_WARNING, "shmop_delete: error no such segment");
>               RETURN_FALSE;
>       }
>  
>       if (shmctl(shmop->shmid, IPC_RMID, NULL)) {
> -             php_error(E_WARNING, "shmdelete: can't mark segment for deletion (are 
>you the owner?)");
> +             php_error(E_WARNING, "shmop_delete: can't mark segment for deletion 
>(are you the owner?)");
>               RETURN_FALSE;
>       }
>  
> 



-- 
Yasuo Ohgaki


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to