<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none"><!--P{margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr" style="font-size:12pt;color:#000000;background-color:#FFFFFF;font-family:Calibri,Arial,Helvetica,sans-serif;">
Hi,<br>
<br>
I am sorry if I am cross-posting from <a href="https://discuss.ocaml.org/t/ctypes-and-structs-containing-strings/1752">
https://discuss.ocaml.org/t/ctypes-and-structs-containing-strings/1752</a> but the post there got no attention and I was told that it was a better idea to ask on the mailing-list.<br>
<br>
In `ocaml-opasswd` (<a href="https://github.com/xapi-project/ocaml-opasswd">https://github.com/xapi-project/ocaml-opasswd)</a> we are using ctypes to bind some functions from `passwd.h` and `shadow.h`. In rare cases, when using the library to update an entry
 in the shadow file, it seems that the two strings in the passwd struct are read from uninitialised memory instead of being copies of the ocaml strings that we passed to create the new shadow struct.<br>
<br>
The code is here: <a href="https://github.com/xapi-project/ocaml-opasswd/blob/master/lib/shadow.ml#L20">
https://github.com/xapi-project/ocaml-opasswd/blob/master/lib/shadow.ml#L20</a> and my fear is that declaring those as `string`:<br>
```<br>
let sp_name     = field shadow_t "sp_name" string<br>
let sp_passwd = field shadow_t "sp_passwd" string<br>
```<br>
and then reading or writing them with<br>
```<br>
name     = getf !@sp sp_name;<br>
passwd = getf !@sp sp_passwd;<br>
```<br>
and<br>
```<br>
setf sp_t sp_name sp.name;<br>
setf sp_t sp_passwd sp.passwd;<br>
```<br>
could be wrong. Reading the documentation, it seems that strings view are doing the right copies and allocation there but I don't see other major points of failure. This code has been there for ages, and if it is wrong I am not sure how it should be fixed.
 To add some more context, the part of the code that sometimes seems to behave badly is
<a href="https://github.com/xapi-project/ocaml-opasswd/blob/master/lib/common.ml#L19-L21">
https://github.com/xapi-project/ocaml-opasswd/blob/master/lib/common.ml#L19-L21</a>
<br>
<br>
Is the declaration clearly wrong? How should I declare the strings and properly copy them between c and ocaml when using ctypes, should they be char ptr and handled manually?<br>
<br>
Thanks in advance for the help.<br>
<br>
Best,<br>
Marcello<br>
<br>
</body>
</html>