--- bind-translator.scm	(revision 28317)
+++ bind-translator.scm	(working copy)
@@ -579,10 +579,15 @@
 	    ,(sprintf "~A ~A *tmp_ = (~A ~A *)C_malloc(sizeof(~A ~A));~%~AC_return(tmp_);"
                       m sname m sname m sname
                       (string-intersperse
-                       (map (lambda (f) (sprintf "tmp_->~A = ~A~A;~%~n"
+                       (map (lambda (f) (sprintf "tmp_->~A = ~A~A~A;~%~n"
                                             (cadr f)
-                                            (if (struct-by-val? f) "*" "")
-                                            (cadr f)))
+                                            (cond ((struct-by-val? f) "*")
+                                                  ((member (car f) '(c-string c-string*)) "strdup(")
+                                                  (else ""))
+                                            (cadr f)
+                                            (if (member (car f) '(c-string c-string*))
+                                                ")"
+                                                "")))
                             fields)
                        "") ) ) ) ) ) ) ) )
 
@@ -1024,7 +1029,9 @@
                    ,(sprintf "return(s->~A);" name) )) ]
          ;; setter body
          [s  `(,(rename 'foreign-lambda*) void (,args (,type x) )
-               ,(sprintf "s->~A = x;" name) ) ])
+               ,(if (member type '(c-string c-string*))
+                    (sprintf "s->~A = strdup(x);" name)
+                    (sprintf "s->~A = x;" name)) ) ])
     (emit (if mut?
               (if (struct-by-val? type)
                   (error "mutable nested structs not supported" (conc type " " name " in struct " sname))
