Thread: Print warning when I execute my own extension function
Hi hackers,
I've read in this blog (http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/)
and I wrote an extension about base36_encode with c code
```
postgres=# SELECT base36_encode(123);
WARNING: problem in alloc set ExprContext: detected write past chunk end in block 0x55fb75334d40, chunk 0x55fb75334d68
WARNING: problem in alloc set ExprContext: detected write past chunk end in block 0x55fb75334d40, chunk 0x55fb75334d68
base36_encode
---------------
3f
(1 row)
```
I've read in this blog (http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/)
and I wrote an extension about base36_encode with c code
but when I executed a query like this below I got a warning below.
```
postgres=# SELECT base36_encode(123);
WARNING: problem in alloc set ExprContext: detected write past chunk end in block 0x55fb75334d40, chunk 0x55fb75334d68
WARNING: problem in alloc set ExprContext: detected write past chunk end in block 0x55fb75334d40, chunk 0x55fb75334d68
base36_encode
---------------
3f
(1 row)
```
I don't know what this warning means and how I can fix it.
Thanks
Dong Wook Lee.
Hi, On Sun, Feb 20, 2022 at 07:23:56PM +0900, Dong Wook Lee wrote: > Hi hackers, > I've read in this blog ( > http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/) > and I wrote an extension about base36_encode with c code > but when I executed a query like this below I got a warning below. > > ``` > postgres=# SELECT base36_encode(123); > WARNING: problem in alloc set ExprContext: detected write past chunk end > in block 0x55fb75334d40, chunk 0x55fb75334d68 > WARNING: problem in alloc set ExprContext: detected write past chunk end > in block 0x55fb75334d40, chunk 0x55fb75334d68 > base36_encode > --------------- > 3f > (1 row) > ``` > > I don't know what this warning means and how I can fix it. It means that you have some problem in your memory allocation. You can refer to src/backend/utils/mmgr/aset.c for more details on those safety checks.
I found a source code line that prints warning in the source code (src/backend/utils/mmgr/aset.c, line 1496) /* │ 1492 * Check for overwrite of padding space in an allocated chunk. │ 1493 */ │ 1494 if (chunk->aset == (void *) set && dsize < chsize && │ 1495 !sentinel_ok(chunk, ALLOC_CHUNKHDRSZ + dsize)) │B+>1496 elog(WARNING, "problem in alloc set %s: detected write past chunk end in block %p, chunk %p", │ 1497 name, block, chunk); In my extension c code. I assigned value at the allocated memory address and I found this assigned statement occurs warning should I don't use it like this? ``` char *buffer = palloc(7 * sizeof(char)); unsigned int offset = sizeof(buffer); > buffer[--offset] = '\0'; /* here */ ``` 2022년 2월 20일 (일) 오후 7:29, Julien Rouhaud <rjuju123@gmail.com>님이 작성: > > Hi, > > On Sun, Feb 20, 2022 at 07:23:56PM +0900, Dong Wook Lee wrote: > > Hi hackers, > > I've read in this blog ( > > http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/) > > and I wrote an extension about base36_encode with c code > > but when I executed a query like this below I got a warning below. > > > > ``` > > postgres=# SELECT base36_encode(123); > > WARNING: problem in alloc set ExprContext: detected write past chunk end > > in block 0x55fb75334d40, chunk 0x55fb75334d68 > > WARNING: problem in alloc set ExprContext: detected write past chunk end > > in block 0x55fb75334d40, chunk 0x55fb75334d68 > > base36_encode > > --------------- > > 3f > > (1 row) > > ``` > > > > I don't know what this warning means and how I can fix it. > > It means that you have some problem in your memory allocation. You can refer > to src/backend/utils/mmgr/aset.c for more details on those safety checks.
now I found a bug in this code. I found the code of this part below is wrong ``` char *buffer = palloc(7 * sizeof(char)); >> unsigned int offset = sizeof(buffer); // wrong buffer[--offset] = '\0'; /* here */ ``` Thank you for replying 2022년 2월 20일 (일) 오후 11:51, Dong Wook Lee <sh95119@gmail.com>님이 작성: > > I found a source code line that prints warning in the source code > (src/backend/utils/mmgr/aset.c, line 1496) > /* > │ 1492 * Check for overwrite of > padding space in an allocated chunk. > │ 1493 */ > │ 1494 if (chunk->aset == (void *) > set && dsize < chsize && > │ 1495 !sentinel_ok(chunk, > ALLOC_CHUNKHDRSZ + dsize)) > │B+>1496 elog(WARNING, "problem > in alloc set %s: detected write past chunk end in block %p, chunk %p", > │ 1497 name, block, chunk); > > In my extension c code. > I assigned value at the allocated memory address > and I found this assigned statement occurs warning > should I don't use it like this? > ``` > char *buffer = palloc(7 * sizeof(char)); > unsigned int offset = sizeof(buffer); > > buffer[--offset] = '\0'; /* here */ > ``` > > > > 2022년 2월 20일 (일) 오후 7:29, Julien Rouhaud <rjuju123@gmail.com>님이 작성: > > > > Hi, > > > > On Sun, Feb 20, 2022 at 07:23:56PM +0900, Dong Wook Lee wrote: > > > Hi hackers, > > > I've read in this blog ( > > > http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/) > > > and I wrote an extension about base36_encode with c code > > > but when I executed a query like this below I got a warning below. > > > > > > ``` > > > postgres=# SELECT base36_encode(123); > > > WARNING: problem in alloc set ExprContext: detected write past chunk end > > > in block 0x55fb75334d40, chunk 0x55fb75334d68 > > > WARNING: problem in alloc set ExprContext: detected write past chunk end > > > in block 0x55fb75334d40, chunk 0x55fb75334d68 > > > base36_encode > > > --------------- > > > 3f > > > (1 row) > > > ``` > > > > > > I don't know what this warning means and how I can fix it. > > > > It means that you have some problem in your memory allocation. You can refer > > to src/backend/utils/mmgr/aset.c for more details on those safety checks.