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]