grant-revoke-6.5.2.patch
text/plain
Filename: grant-revoke-6.5.2.patch
Type: text/plain
Part: 0
Message:
grant/revoke bug with delete/update
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/catalog/aclchk.c | 2 | 2 |
| src/backend/commands/command.c | 3 | 1 |
| src/backend/commands/copy.c | 2 | 1 |
| src/backend/commands/sequence.c | 2 | 1 |
| src/backend/commands/user.c | 6 | 4 |
| src/backend/executor/execMain.c | 9 | 6 |
| src/backend/parser/gram.y | 4 | 4 |
| src/backend/parser/parse_func.c | 2 | 1 |
| src/backend/parser/parse.h | 230 | 230 |
| src/backend/rewrite/locks.c | 8 | 1 |
| src/backend/rewrite/rewriteHandler.c | 8 | 1 |
| src/backend/utils/adt/acl.c | 9 | 7 |
| src/include/utils/acl.h | 10 | 6 |
diff -urbw postgresql-6.5.2/src/backend/catalog/aclchk.c postgresql-6.5.2-patched/src/backend/catalog/aclchk.c
--- postgresql-6.5.2/src/backend/catalog/aclchk.c Mon Aug 2 07:56:53 1999
+++ postgresql-6.5.2-patched/src/backend/catalog/aclchk.c Wed Mar 1 16:39:44 2000
@@ -381,7 +381,7 @@
* pg_database table, there is still additional permissions
* checking in dbcommands.c
*/
- if ((mode & ACL_WR) || (mode & ACL_AP))
+ if (mode & ACL_AP)
return ACLCHECK_OK;
}
@@ -390,7 +390,7 @@
* pg_shadow.usecatupd is set. (This is to let superusers protect
* themselves from themselves.)
*/
- if (((mode & ACL_WR) || (mode & ACL_AP)) &&
+ if ((mode & ACL_AP) &&
!allowSystemTableMods && IsSystemRelationName(relname) &&
!((Form_pg_shadow) GETSTRUCT(tuple))->usecatupd)
{
diff -urbw postgresql-6.5.2/src/backend/commands/command.c postgresql-6.5.2-patched/src/backend/commands/command.c
--- postgresql-6.5.2/src/backend/commands/command.c Mon Aug 2 07:56:57 1999
+++ postgresql-6.5.2-patched/src/backend/commands/command.c Wed Mar 1 16:30:23 2000
@@ -524,7 +524,9 @@
if (lockstmt->mode == AccessShareLock)
aclresult = pg_aclcheck(lockstmt->relname, GetPgUserName(), ACL_RD);
else
- aclresult = pg_aclcheck(lockstmt->relname, GetPgUserName(), ACL_WR);
+ /* do we really need to have all these permissions at the same time ? */
+ /* shouldn't we test lockstmt->mode first ? */
+ aclresult = pg_aclcheck(lockstmt->relname, GetPgUserName(), (ACL_AP | ACL_DE | ACL_UP));
if (aclresult != ACLCHECK_OK)
elog(ERROR, "LOCK TABLE: permission denied");
diff -urbw postgresql-6.5.2/src/backend/commands/copy.c postgresql-6.5.2-patched/src/backend/commands/copy.c
--- postgresql-6.5.2/src/backend/commands/copy.c Sat Jul 3 02:32:39 1999
+++ postgresql-6.5.2-patched/src/backend/commands/copy.c Wed Mar 1 16:30:35 2000
@@ -242,7 +242,8 @@
FILE *fp;
Relation rel;
extern char *UserName; /* defined in global.c */
- const AclMode required_access = from ? ACL_WR : ACL_RD;
+ /* why should we need other permissions than APPEND ? */
+ const AclMode required_access = from ? ACL_AP : ACL_RD;
int result;
rel = heap_openr(relname);
diff -urbw postgresql-6.5.2/src/backend/commands/sequence.c postgresql-6.5.2-patched/src/backend/commands/sequence.c
--- postgresql-6.5.2/src/backend/commands/sequence.c Mon Aug 2 07:56:59 1999
+++ postgresql-6.5.2-patched/src/backend/commands/sequence.c Wed Mar 1 16:31:05 2000
@@ -314,7 +314,8 @@
Form_pg_sequence seq;
#ifndef NO_SECURITY
- if (pg_aclcheck(seqname, getpgusername(), ACL_WR) != ACLCHECK_OK)
+ /* why should we need more than UPDATE permission ? */
+ if (pg_aclcheck(seqname, getpgusername(), ACL_UP) != ACLCHECK_OK)
elog(ERROR, "%s.setval: you don't have permissions to set sequence %s",
seqname, seqname);
#endif
diff -urbw postgresql-6.5.2/src/backend/commands/user.c postgresql-6.5.2-patched/src/backend/commands/user.c
--- postgresql-6.5.2/src/backend/commands/user.c Mon Aug 2 07:56:59 1999
+++ postgresql-6.5.2-patched/src/backend/commands/user.c Wed Mar 1 16:31:38 2000
@@ -115,7 +115,7 @@
* pg_shadow relation.
*/
pg_shadow = GetPgUserName();
- if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_WR | ACL_AP) != ACLCHECK_OK)
+ if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_AP | ACL_DE | ACL_UP) != ACLCHECK_OK)
{
UserAbortTransactionBlock();
elog(ERROR, "defineUser: user \"%s\" does not have SELECT and INSERT privilege for \"%s\"",
@@ -227,7 +227,8 @@
* pg_shadow relation.
*/
pg_shadow = GetPgUserName();
- if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_WR) != ACLCHECK_OK)
+ /* why should we need more than UPDATE ? */
+ if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_UP) != ACLCHECK_OK)
{
UserAbortTransactionBlock();
elog(ERROR, "alterUser: user \"%s\" does not have SELECT and UPDATE privilege for \"%s\"",
@@ -329,11 +330,12 @@
BeginTransactionBlock();
/*
- * Make sure the user attempting to create a user can delete from the
+ * Make sure the user attempting to delete a user can delete from the
* pg_shadow relation.
*/
pg_shadow = GetPgUserName();
- if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_WR) != ACLCHECK_OK)
+ /* why should we need more than DELETE ? */
+ if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_DE) != ACLCHECK_OK)
{
UserAbortTransactionBlock();
elog(ERROR, "removeUser: user \"%s\" does not have SELECT and DELETE privilege for \"%s\"",
diff -urbw postgresql-6.5.2/src/backend/executor/execMain.c postgresql-6.5.2-patched/src/backend/executor/execMain.c
--- postgresql-6.5.2/src/backend/executor/execMain.c Thu Jun 17 17:15:49 1999
+++ postgresql-6.5.2-patched/src/backend/executor/execMain.c Wed Mar 1 18:31:31 2000
@@ -464,14 +464,16 @@
switch (operation)
{
case CMD_INSERT:
- ok = ((aclcheck_result = CHECK(ACL_AP)) == ACLCHECK_OK) ||
- ((aclcheck_result = CHECK(ACL_WR)) == ACLCHECK_OK);
+ ok = ((aclcheck_result = CHECK(ACL_AP)) == ACLCHECK_OK);
opstr = "append";
break;
case CMD_DELETE:
+ ok = ((aclcheck_result = CHECK(ACL_DE)) == ACLCHECK_OK);
+ opstr = "delete";
+ break;
case CMD_UPDATE:
- ok = ((aclcheck_result = CHECK(ACL_WR)) == ACLCHECK_OK);
- opstr = "write";
+ ok = ((aclcheck_result = CHECK(ACL_UP)) == ACLCHECK_OK);
+ opstr = "update";
break;
default:
elog(ERROR, "ExecCheckPerms: bogus operation %d",
@@ -508,8 +510,9 @@
StrNCpy(rname.data,
((Form_pg_class) GETSTRUCT(htup))->relname.data,
NAMEDATALEN);
- ok = ((aclcheck_result = CHECK(ACL_WR)) == ACLCHECK_OK);
- opstr = "write";
+ /* is it the right thing to do ? */
+ ok = ((aclcheck_result = CHECK((ACL_AP | ACL_DE | ACL_UP))) == ACLCHECK_OK);
+ opstr = "write"; /* unused ? */
if (!ok)
elog(ERROR, "%s: %s", rname.data, aclcheck_error_strings[aclcheck_result]);
}
diff -urbw postgresql-6.5.2/src/backend/parser/gram.y postgresql-6.5.2-patched/src/backend/parser/gram.y
--- postgresql-6.5.2/src/backend/parser/gram.y Tue Sep 14 08:07:35 1999
+++ postgresql-6.5.2-patched/src/backend/parser/gram.y Wed Mar 1 16:33:34 2000
@@ -1694,11 +1694,11 @@
privileges: ALL PRIVILEGES
{
- $$ = aclmakepriv("rwaR",0);
+ $$ = aclmakepriv("raduR",0);
}
| ALL
{
- $$ = aclmakepriv("rwaR",0);
+ $$ = aclmakepriv("raduR",0);
}
| operation_commalist
{
@@ -1726,11 +1726,11 @@
}
| UPDATE
{
- $$ = ACL_MODE_WR_CHR;
+ $$ = ACL_MODE_UP_CHR;
}
| DELETE
{
- $$ = ACL_MODE_WR_CHR;
+ $$ = ACL_MODE_DE_CHR;
}
| RULE
{
diff -urbw postgresql-6.5.2/src/backend/parser/parse.h postgresql-6.5.2-patched/src/backend/parser/parse.h
--- postgresql-6.5.2/src/backend/parser/parse.h Thu Sep 16 02:23:39 1999
+++ postgresql-6.5.2-patched/src/backend/parser/parse.h Wed Mar 1 18:34:46 2000
@@ -29,236 +29,236 @@
RuleStmt *rstmt;
InsertStmt *astmt;
} YYSTYPE;
-#define ABSOLUTE 257
-#define ACTION 258
-#define ADD 259
-#define ALL 260
-#define ALTER 261
-#define AND 262
-#define ANY 263
-#define AS 264
-#define ASC 265
-#define BEGIN_TRANS 266
-#define BETWEEN 267
-#define BOTH 268
-#define BY 269
-#define CASCADE 270
-#define CASE 271
-#define CAST 272
-#define CHAR 273
-#define CHARACTER 274
-#define CHECK 275
-#define CLOSE 276
-#define COALESCE 277
-#define COLLATE 278
-#define COLUMN 279
-#define COMMIT 280
-#define CONSTRAINT 281
-#define CREATE 282
-#define CROSS 283
-#define CURRENT 284
-#define CURRENT_DATE 285
-#define CURRENT_TIME 286
-#define CURRENT_TIMESTAMP 287
-#define CURRENT_USER 288
-#define CURSOR 289
-#define DAY_P 290
-#define DECIMAL 291
-#define DECLARE 292
-#define DEFAULT 293
-#define DELETE 294
-#define DESC 295
-#define DISTINCT 296
-#define DOUBLE 297
-#define DROP 298
-#define ELSE 299
-#define END_TRANS 300
-#define EXCEPT 301
-#define EXECUTE 302
-#define EXISTS 303
-#define EXTRACT 304
-#define FALSE_P 305
-#define FETCH 306
-#define FLOAT 307
-#define FOR 308
-#define FOREIGN 309
-#define FROM 310
-#define FULL 311
-#define GLOBAL 312
-#define GRANT 313
-#define GROUP 314
-#define HAVING 315
-#define HOUR_P 316
-#define IN 317
-#define INNER_P 318
-#define INSENSITIVE 319
-#define INSERT 320
-#define INTERSECT 321
-#define INTERVAL 322
-#define INTO 323
-#define IS 324
-#define ISOLATION 325
-#define JOIN 326
-#define KEY 327
-#define LANGUAGE 328
-#define LEADING 329
-#define LEFT 330
-#define LEVEL 331
-#define LIKE 332
-#define LOCAL 333
-#define MATCH 334
-#define MINUTE_P 335
-#define MONTH_P 336
-#define NAMES 337
-#define NATIONAL 338
-#define NATURAL 339
-#define NCHAR 340
-#define NEXT 341
-#define NO 342
-#define NOT 343
-#define NULLIF 344
-#define NULL_P 345
-#define NUMERIC 346
-#define OF 347
-#define ON 348
-#define ONLY 349
-#define OPTION 350
-#define OR 351
-#define ORDER 352
-#define OUTER_P 353
-#define PARTIAL 354
-#define POSITION 355
-#define PRECISION 356
-#define PRIMARY 357
-#define PRIOR 358
-#define PRIVILEGES 359
-#define PROCEDURE 360
-#define PUBLIC 361
-#define READ 362
-#define REFERENCES 363
-#define RELATIVE 364
-#define REVOKE 365
-#define RIGHT 366
-#define ROLLBACK 367
-#define SCROLL 368
-#define SECOND_P 369
-#define SELECT 370
-#define SET 371
-#define SUBSTRING 372
-#define TABLE 373
-#define TEMP 374
-#define TEMPORARY 375
-#define THEN 376
-#define TIME 377
-#define TIMESTAMP 378
-#define TIMEZONE_HOUR 379
-#define TIMEZONE_MINUTE 380
-#define TO 381
-#define TRAILING 382
-#define TRANSACTION 383
-#define TRIM 384
-#define TRUE_P 385
-#define UNION 386
-#define UNIQUE 387
-#define UPDATE 388
-#define USER 389
-#define USING 390
-#define VALUES 391
-#define VARCHAR 392
-#define VARYING 393
-#define VIEW 394
-#define WHEN 395
-#define WHERE 396
-#define WITH 397
-#define WORK 398
-#define YEAR_P 399
-#define ZONE 400
-#define TRIGGER 401
-#define COMMITTED 402
-#define SERIALIZABLE 403
-#define TYPE_P 404
-#define ABORT_TRANS 405
-#define ACCESS 406
-#define AFTER 407
-#define AGGREGATE 408
-#define ANALYZE 409
-#define BACKWARD 410
-#define BEFORE 411
-#define BINARY 412
-#define CACHE 413
-#define CLUSTER 414
-#define COPY 415
-#define CREATEDB 416
-#define CREATEUSER 417
-#define CYCLE 418
-#define DATABASE 419
-#define DELIMITERS 420
-#define DO 421
-#define EACH 422
-#define ENCODING 423
-#define EXCLUSIVE 424
-#define EXPLAIN 425
-#define EXTEND 426
-#define FORWARD 427
-#define FUNCTION 428
-#define HANDLER 429
-#define INCREMENT 430
-#define INDEX 431
-#define INHERITS 432
-#define INSTEAD 433
-#define ISNULL 434
-#define LANCOMPILER 435
-#define LIMIT 436
-#define LISTEN 437
-#define LOAD 438
-#define LOCATION 439
-#define LOCK_P 440
-#define MAXVALUE 441
-#define MINVALUE 442
-#define MODE 443
-#define MOVE 444
-#define NEW 445
-#define NOCREATEDB 446
-#define NOCREATEUSER 447
-#define NONE 448
-#define NOTHING 449
-#define NOTIFY 450
-#define NOTNULL 451
-#define OFFSET 452
-#define OIDS 453
-#define OPERATOR 454
-#define PASSWORD 455
-#define PROCEDURAL 456
-#define RENAME 457
-#define RESET 458
-#define RETURNS 459
-#define ROW 460
-#define RULE 461
-#define SEQUENCE 462
-#define SERIAL 463
-#define SETOF 464
-#define SHARE 465
-#define SHOW 466
-#define START 467
-#define STATEMENT 468
-#define STDIN 469
-#define STDOUT 470
-#define TRUSTED 471
-#define UNLISTEN 472
-#define UNTIL 473
-#define VACUUM 474
-#define VALID 475
-#define VERBOSE 476
-#define VERSION 477
-#define IDENT 478
-#define SCONST 479
-#define Op 480
-#define ICONST 481
-#define PARAM 482
-#define FCONST 483
-#define OP 484
-#define UMINUS 485
-#define TYPECAST 486
+#define ABSOLUTE 258
+#define ACTION 259
+#define ADD 260
+#define ALL 261
+#define ALTER 262
+#define AND 263
+#define ANY 264
+#define AS 265
+#define ASC 266
+#define BEGIN_TRANS 267
+#define BETWEEN 268
+#define BOTH 269
+#define BY 270
+#define CASCADE 271
+#define CASE 272
+#define CAST 273
+#define CHAR 274
+#define CHARACTER 275
+#define CHECK 276
+#define CLOSE 277
+#define COALESCE 278
+#define COLLATE 279
+#define COLUMN 280
+#define COMMIT 281
+#define CONSTRAINT 282
+#define CREATE 283
+#define CROSS 284
+#define CURRENT 285
+#define CURRENT_DATE 286
+#define CURRENT_TIME 287
+#define CURRENT_TIMESTAMP 288
+#define CURRENT_USER 289
+#define CURSOR 290
+#define DAY_P 291
+#define DECIMAL 292
+#define DECLARE 293
+#define DEFAULT 294
+#define DELETE 295
+#define DESC 296
+#define DISTINCT 297
+#define DOUBLE 298
+#define DROP 299
+#define ELSE 300
+#define END_TRANS 301
+#define EXCEPT 302
+#define EXECUTE 303
+#define EXISTS 304
+#define EXTRACT 305
+#define FALSE_P 306
+#define FETCH 307
+#define FLOAT 308
+#define FOR 309
+#define FOREIGN 310
+#define FROM 311
+#define FULL 312
+#define GLOBAL 313
+#define GRANT 314
+#define GROUP 315
+#define HAVING 316
+#define HOUR_P 317
+#define IN 318
+#define INNER_P 319
+#define INSENSITIVE 320
+#define INSERT 321
+#define INTERSECT 322
+#define INTERVAL 323
+#define INTO 324
+#define IS 325
+#define ISOLATION 326
+#define JOIN 327
+#define KEY 328
+#define LANGUAGE 329
+#define LEADING 330
+#define LEFT 331
+#define LEVEL 332
+#define LIKE 333
+#define LOCAL 334
+#define MATCH 335
+#define MINUTE_P 336
+#define MONTH_P 337
+#define NAMES 338
+#define NATIONAL 339
+#define NATURAL 340
+#define NCHAR 341
+#define NEXT 342
+#define NO 343
+#define NOT 344
+#define NULLIF 345
+#define NULL_P 346
+#define NUMERIC 347
+#define OF 348
+#define ON 349
+#define ONLY 350
+#define OPTION 351
+#define OR 352
+#define ORDER 353
+#define OUTER_P 354
+#define PARTIAL 355
+#define POSITION 356
+#define PRECISION 357
+#define PRIMARY 358
+#define PRIOR 359
+#define PRIVILEGES 360
+#define PROCEDURE 361
+#define PUBLIC 362
+#define READ 363
+#define REFERENCES 364
+#define RELATIVE 365
+#define REVOKE 366
+#define RIGHT 367
+#define ROLLBACK 368
+#define SCROLL 369
+#define SECOND_P 370
+#define SELECT 371
+#define SET 372
+#define SUBSTRING 373
+#define TABLE 374
+#define TEMP 375
+#define TEMPORARY 376
+#define THEN 377
+#define TIME 378
+#define TIMESTAMP 379
+#define TIMEZONE_HOUR 380
+#define TIMEZONE_MINUTE 381
+#define TO 382
+#define TRAILING 383
+#define TRANSACTION 384
+#define TRIM 385
+#define TRUE_P 386
+#define UNION 387
+#define UNIQUE 388
+#define UPDATE 389
+#define USER 390
+#define USING 391
+#define VALUES 392
+#define VARCHAR 393
+#define VARYING 394
+#define VIEW 395
+#define WHEN 396
+#define WHERE 397
+#define WITH 398
+#define WORK 399
+#define YEAR_P 400
+#define ZONE 401
+#define TRIGGER 402
+#define COMMITTED 403
+#define SERIALIZABLE 404
+#define TYPE_P 405
+#define ABORT_TRANS 406
+#define ACCESS 407
+#define AFTER 408
+#define AGGREGATE 409
+#define ANALYZE 410
+#define BACKWARD 411
+#define BEFORE 412
+#define BINARY 413
+#define CACHE 414
+#define CLUSTER 415
+#define COPY 416
+#define CREATEDB 417
+#define CREATEUSER 418
+#define CYCLE 419
+#define DATABASE 420
+#define DELIMITERS 421
+#define DO 422
+#define EACH 423
+#define ENCODING 424
+#define EXCLUSIVE 425
+#define EXPLAIN 426
+#define EXTEND 427
+#define FORWARD 428
+#define FUNCTION 429
+#define HANDLER 430
+#define INCREMENT 431
+#define INDEX 432
+#define INHERITS 433
+#define INSTEAD 434
+#define ISNULL 435
+#define LANCOMPILER 436
+#define LIMIT 437
+#define LISTEN 438
+#define LOAD 439
+#define LOCATION 440
+#define LOCK_P 441
+#define MAXVALUE 442
+#define MINVALUE 443
+#define MODE 444
+#define MOVE 445
+#define NEW 446
+#define NOCREATEDB 447
+#define NOCREATEUSER 448
+#define NONE 449
+#define NOTHING 450
+#define NOTIFY 451
+#define NOTNULL 452
+#define OFFSET 453
+#define OIDS 454
+#define OPERATOR 455
+#define PASSWORD 456
+#define PROCEDURAL 457
+#define RENAME 458
+#define RESET 459
+#define RETURNS 460
+#define ROW 461
+#define RULE 462
+#define SEQUENCE 463
+#define SERIAL 464
+#define SETOF 465
+#define SHARE 466
+#define SHOW 467
+#define START 468
+#define STATEMENT 469
+#define STDIN 470
+#define STDOUT 471
+#define TRUSTED 472
+#define UNLISTEN 473
+#define UNTIL 474
+#define VACUUM 475
+#define VALID 476
+#define VERBOSE 477
+#define VERSION 478
+#define IDENT 479
+#define SCONST 480
+#define Op 481
+#define ICONST 482
+#define PARAM 483
+#define FCONST 484
+#define OP 485
+#define UMINUS 486
+#define TYPECAST 487
extern YYSTYPE yylval;
diff -urbw postgresql-6.5.2/src/backend/parser/parse_func.c postgresql-6.5.2-patched/src/backend/parser/parse_func.c
--- postgresql-6.5.2/src/backend/parser/parse_func.c Fri Jun 18 00:21:40 1999
+++ postgresql-6.5.2-patched/src/backend/parser/parse_func.c Wed Mar 1 16:33:53 2000
@@ -601,7 +601,8 @@
if ((aclcheck_result = pg_aclcheck(seqrel, GetPgUserName(),
(((funcid == F_NEXTVAL) || (funcid == F_SETVAL)) ?
- ACL_WR : ACL_RD)))
+ /* if nextval and setval are atomic, which I don't know, update should be enough */
+ ACL_UP : ACL_RD)))
!= ACLCHECK_OK)
elog(ERROR, "%s.%s: %s",
seqrel, funcname, aclcheck_error_strings[aclcheck_result]);
diff -urbw postgresql-6.5.2/src/backend/rewrite/locks.c postgresql-6.5.2-patched/src/backend/rewrite/locks.c
--- postgresql-6.5.2/src/backend/rewrite/locks.c Sun Feb 14 00:17:44 1999
+++ postgresql-6.5.2-patched/src/backend/rewrite/locks.c Wed Mar 1 16:34:20 2000
@@ -228,8 +228,15 @@
case CMD_INSERT:
reqperm = ACL_AP;
break;
+ case CMD_DELETE:
+ reqperm = ACL_DE;
+ break;
+ case CMD_UPDATE:
+ reqperm = ACL_UP;
+ break;
default:
- reqperm = ACL_WR;
+ /* is it The Right Thing To Do (tm) ? */
+ reqperm = ACL_AP | ACL_DE | ACL_UP;
break;
}
else
diff -urbw postgresql-6.5.2/src/backend/rewrite/rewriteHandler.c postgresql-6.5.2-patched/src/backend/rewrite/rewriteHandler.c
--- postgresql-6.5.2/src/backend/rewrite/rewriteHandler.c Sun Jul 11 19:54:30 1999
+++ postgresql-6.5.2-patched/src/backend/rewrite/rewriteHandler.c Wed Mar 1 16:35:01 2000
@@ -2282,8 +2282,15 @@
case CMD_INSERT:
reqperm = ACL_AP;
break;
+ case CMD_DELETE:
+ reqperm = ACL_DE;
+ break;
+ case CMD_UPDATE:
+ reqperm = ACL_UP;
+ break;
default:
- reqperm = ACL_WR;
+ /* is it The Right Thing To Do (tm) ? */
+ reqperm = ACL_AP | ACL_DE | ACL_UP;
break;
}
diff -urbw postgresql-6.5.2/src/backend/storage/file/fd.c postgresql-6.5.2-patched/src/backend/storage/file/fd.c
diff -urbw postgresql-6.5.2/src/backend/utils/adt/acl.c postgresql-6.5.2-patched/src/backend/utils/adt/acl.c
--- postgresql-6.5.2/src/backend/utils/adt/acl.c Mon Aug 2 07:24:49 1999
+++ postgresql-6.5.2-patched/src/backend/utils/adt/acl.c Wed Mar 1 16:35:53 2000
@@ -154,8 +154,11 @@
case ACL_MODE_RD_CHR:
aip->ai_mode |= ACL_RD;
break;
- case ACL_MODE_WR_CHR:
- aip->ai_mode |= ACL_WR;
+ case ACL_MODE_DE_CHR:
+ aip->ai_mode |= ACL_DE;
+ break;
+ case ACL_MODE_UP_CHR:
+ aip->ai_mode |= ACL_UP;
break;
case ACL_MODE_RU_CHR:
aip->ai_mode |= ACL_RU;
@@ -272,7 +275,7 @@
if (!aip)
aip = &default_aclitem;
- p = out = palloc(strlen("group =arwR ") + 1 + NAMEDATALEN);
+ p = out = palloc(strlen("group =arRdu ") + 1 + NAMEDATALEN);
if (!out)
elog(ERROR, "aclitemout: palloc failed");
*p = '\0';
@@ -605,9 +608,8 @@
int i;
int l;
- Assert(strlen(old_privlist) < 5);
- priv = palloc(5); /* at most "rwaR" */ ;
-
+ Assert(strlen(old_privlist) < 6);
+ priv = palloc(6); /* at most "arduR" */ ;
if (old_privlist == NULL || old_privlist[0] == '\0')
{
priv[0] = new_priv;
@@ -619,7 +621,7 @@
l = strlen(old_privlist);
- if (l == 4)
+ if (l == 5)
{ /* can't add any more privileges */
return priv;
}
diff -urbw postgresql-6.5.2/src/include/utils/acl.h postgresql-6.5.2-patched/src/include/utils/acl.h
--- postgresql-6.5.2/src/include/utils/acl.h Fri Jul 30 19:07:22 1999
+++ postgresql-6.5.2-patched/src/include/utils/acl.h Wed Mar 1 16:40:50 2000
@@ -54,9 +54,10 @@
#define ACL_NO 0 /* no permissions */
#define ACL_AP (1<<0) /* append */
#define ACL_RD (1<<1) /* read */
-#define ACL_WR (1<<2) /* write (append/delete/replace) */
-#define ACL_RU (1<<3) /* place rules */
-#define N_ACL_MODES 4
+#define ACL_DE (1<<2) /* delete */
+#define ACL_UP (1<<3) /* update/replace */
+#define ACL_RU (1<<4) /* place rules */
+#define N_ACL_MODES 5
#define ACL_MODECHG_ADD 1
#define ACL_MODECHG_DEL 2
@@ -65,7 +66,8 @@
/* change this line if you want to set the default acl permission */
#define ACL_WORLD_DEFAULT (ACL_NO)
/* #define ACL_WORLD_DEFAULT (ACL_RD|ACL_WR|ACL_AP|ACL_RU) */
-#define ACL_OWNER_DEFAULT (ACL_RD|ACL_WR|ACL_AP|ACL_RU)
+
+#define ACL_OWNER_DEFAULT (ACL_AP|ACL_RD|ACL_RU|ACL_DE|ACL_UP)
/*
* AclItem
@@ -118,10 +120,12 @@
#define ACL_MODECHG_ADD_CHR '+'
#define ACL_MODECHG_DEL_CHR '-'
#define ACL_MODECHG_EQL_CHR '='
-#define ACL_MODE_STR "arwR" /* list of valid characters */
+
+#define ACL_MODE_STR "arduR" /* list of valid characters */
#define ACL_MODE_AP_CHR 'a'
#define ACL_MODE_RD_CHR 'r'
-#define ACL_MODE_WR_CHR 'w'
+#define ACL_MODE_DE_CHR 'd'
+#define ACL_MODE_UP_CHR 'u'
#define ACL_MODE_RU_CHR 'R'
/* result codes for pg_aclcheck */